Stubbing:在Model Class上找到

时间:2012-03-10 14:26:32

标签: ruby-on-rails-3 rspec mocking stub

给定一个方法为self.fetch_payment_method的模型:

def self.fetch_payment_method
  name = "Omnikassa"
  pm = Spree::PaymentMethod.find(:first, :conditions => [ "lower(name) = ?", name.downcase ]) || raise(ActiveRecord::RecordNotFound)
end

用rspec测试来测试这个:

it 'should find a payment_method' do
  Spree::PaymentMethod.new(:name => "Omnikassa").save
  @omnikassa.class.fetch_payment_method.should be_a_kind_of(Spree::PaymentMethod)
end

我想改进它,因此它不会测试整个堆栈和数据库。为此,我只想在类Spree::PaymentMethod上调用时将“:find”存根。但是:

it 'should find a payment_method' do
  Spree::PaymentMethod.any_instance.stub(:find).and_return(Spree::PaymentMethod.new)
  @omnikassa.class.fetch_payment_method.should be_a_kind_of(Spree::PaymentMethod)
end

不起作用。我对整个BDD / TDD事物都很陌生,对我来说,顽固和嘲弄仍然是一件神奇的事情;所以我很可能会误解顽固和回归究竟在做什么。

我应该如何存根SomeActiveRecordModel.find?

1 个答案:

答案 0 :(得分:4)

你正在做的一切正确,除了应该在Spree::PaymentMethod类本身而不是在它的实例上调用存根方法

通常的做法是使用此存根返回某个实例,而不仅仅是新的实例:

it 'should find a payment_method' do
  payment_meth = mock_model(Spree::PaymentMethod)
  Spree::PaymentMethod.stub!(:find).and_return(payment_meth)

  @omnikassa.class.fetch_payment_method.should be_equal(payment_meth)
end

顺便说一句,你在哪里初始化@omnikassa对象?