据我了解,工厂的“to_create”方法的返回值被忽略了。这意味着从工厂的“build”或“initialize_with”部分返回的对象是在测试中调用“create”时最终返回的对象。
就我而言,我使用的是存储库模式的变体。我正在覆盖工厂的“to_create”部分以包含对存储库“保存”方法的调用。此方法不会修改给定对象,而是返回一个表示原始持久形式的对象。
但是,从“build”块返回的实例是从工厂返回的,而不是在“to_create”块中创建的实例。在我的代码中,这意味着返回对象的“未持久化”形式,而不是保存操作中具有更新属性(例如“id”)的对象。
有没有办法强制“create”的返回值是“to_create”块的结果或该块中生成的某个值?
class Foo
attr_accessor :id, :name
...
end
class FooRepository
def self.create(name)
Foo.new(name) # this object is not yet persisted and has no .id
end
def self.save(foo)
# this method must not guarantee that the original Foo instance
# will always be returned
...
updated_foo # this is a duplicate of the original object
end
...
end
FactoryGirl.define do
factory :foo, class: FooRepository do
# create an example Foo
initialize_with { FooRepository.create(name: "Example") }
# save the Foo to the datastore, returning what may be a duplicate
to_create {|instance| FooRepository.save(instance)}
end
end
describe FooRepository do
it "saves the given Foo to the datastore" do
foo = create(:foo)
foo.id #=> nil
...
end
end