铁轨上的红宝石——Rspec should_receive把我难住了



我需要测试是否由于调用类方法而在特定实例上调用了实例方法。类似于:

class Dog < ActiveRecord::Base
  def self.roll_trained
    Dog.all.each { |d| d.rollover if d.trained? }
  end
  def rollover
    # rollover and stuff
  end
  def trained?
    self.trained == true
  end
end

我写了一个测试像:

describe 'Dog.roll_trained' do
  it 'rolls trained dogs' do
    dog_1 = Dog.create(trained: true)
    dog_1.should_receive(:rollover)
    Dog.roll_trained
  end
end

我原以为我有这个权利,但测试失败了。我在这里做错了什么?

这里的问题是dog_1和dog.each上循环的实例不是同一个实例。这是因为当您执行dog.each 时,ActiveRecord会为数据库中的同一行(dog_1(生成不同的实例

我写了一篇关于这个的博客文章,你可以在这里阅读:ActiveRecord和内存中对象状态

一个解决方案是存根Dog.all-Dog.stub(all: [dog_1])

另一种解决方案是将trained属性保存到数据库中,然后根据数据库进行规范:dog_1.reload.trained.should be_true

相关内容

  • 没有找到相关文章

最新更新