我需要测试是否由于调用类方法而在特定实例上调用了实例方法。类似于:
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