2012-04-26 5 views
0

Кажется, я понял что-то не так. У меня есть классПочему этот метод не называется?

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 

Который specced в Rspec:

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(), чтобы убедиться, что всякий раз, когда я вызываю #find на любой экземпляр, который у меня есть, Spree :: Payment, он что-то возвращает.

Другими словами: я бы ожидал, что stub.and_return избежит попадания в || raise(ActiveRecord::RecordNotFound). Но это не так.

Является ли мое предположение неправильным, мой код? Что-то другое?

ответ

2

В вашем случае find не является методом экземпляра, а методом класса Spree::Payment. Это означает, что вы должны заглушить его напрямую без any_instance:

Spree::Payment.stub(:find).and_return(Spree::Payment.new) 
+1

Быстрее меня! ;) – lucapette

+0

Спасибо! FWIW: также '.should_receive (: find)' должен вызываться без 'any_instance'. – berkes

+0

@berkes, да, вы правы. –

Смежные вопросы