防止RSpec存根将关联对象转换为模拟

时间:2014-02-25 06:20:36

标签: ruby-on-rails rspec fabrication-gem

我最近遇到了一个我很惊讶以前没有见过的问题。我有类似的课程:

class Foo < ActiveRecord::Base
  belongs_to :bar, inverse_of: :foos
end

class Bar < ActiveRecord::Base
  has_many :foos, inverse_of: :bar
end

我正在使用fabricators(我知道这些看起来毫无意义):

Fabricator(:foo, class_name: Foo) do
  bar fabricator: :bar
end

Fabricator(:bar, class_name: Bar) do
end

在测试中(RSpec)我正在做这个存根:

foo = Fabricate(:foo) # I can confirm that both foo and foo.bar are correct here.
Foo.stub(:find_by_id).and_return(foo)

我的问题在于测试,当调用Foo.find_by_id时,它正确返回foofoo.bar是RSpec模拟,并且保存foo会导致此错误消息:

Mock received unexpected message :marked_for_destruction? with (no args)

如何确保关联也与存根一起传递?我找到了this thread,但无法完全解读这一切意味着什么。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

当然,我的问题是,在测试的后期我打电话给Foo.stub_chain(:bar, :property)所以foo.bar当然只是一个RSpec模拟。