为什么没有调用存根方法?

时间:2012-04-26 08:21:09

标签: ruby testing rspec stub

我似乎明白错了。我有一个班级

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

在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()确保无论何时,无论我在Spree :: Payment的任何实例上调用#find,它都会返回一些内容。

换句话说:我希望stub.and_return避免进入|| raise(ActiveRecord::RecordNotFound)。但事实并非如此。

我的假设错了,我的代码?还有别的吗?

1 个答案:

答案 0 :(得分:2)

在您的情况下,find不是实例方法,而是Spree::Payment的类方法。这意味着您应该直接将其存根,而不是any_instance

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