2012-04-26 10 views
0

私は間違ったことを理解したようです。私はクラススタブ付きメソッドが呼び出されないのはなぜですか?

RSPECにspeccedさ
module Spree 
    class OmnikassaPaymentResponse 
    #... 
    # Finds a payment with provided parameters trough ActiveRecord. 
    def payment(state = :processing) 
     Spree::Payment.find(:first, :conditions => { :amount => @amount, :order_id => @order_id, :state => state }) || raise(ActiveRecord::RecordNotFound) 
    end 
    end 
end 

を持っている:

describe "#payment" do 
    it 'should try to find a Spree::Payment' do 
    Spree::Payment.any_instance.stub(:find).and_return(Spree::Payment.new) 
    Spree::Payment.any_instance.should_receive(:find) 
    Spree::OmnikassaPaymentResponse.new(@seal, @data).payment 
    end 
end 

これは、しかし、常にActiveRecord::RecordNotFoundをスローします。私はany_instance.stub(:find).and_return()を期待していましたが、いつでもどこでも、私はSpree :: Paymentの何らかのインスタンスで#findと呼んでいますが、何かを返します。

言い換えれば、stub.and_return|| raise(ActiveRecord::RecordNotFound)になるのを避けると思います。しかし、それはしません。

私の前提は間違っていますか?他に何か?

答えて

2

findはインスタンスメソッドではなく、Spree::Paymentのクラスメソッドです。つまり、any_instanceのように直接スタブする必要があります。

+1

私よりも速い! ;) – lucapette

+0

ありがとう! FWIW: '.should_receive(:find)'も 'any_instance'なしで呼び出さなければなりません。 – berkes

+0

@berkes、はい、そうです。 –

関連する問題