RSpec / FactoryGirl - Rails STI - 平等
RSpec / FactoryGirl - Rails STI - equality
简化示例:
我最近在 Animal
模型上安装了 Single Table Inheritance
。 Cat
和 Dog
是 Animal
的子 class。
我有一个 Animal
工厂:
factory :animal do
type { ["Dog","Cat"] }.sample
end
在我的测试套件中几乎所有地方我都调用
let(:animal) { Factory.create(:animal) }
因为 Animal
的类型与测试无关。自从转向 STI 以来,我在对这些动物执行相等性检查时遇到错误,因为超级 class Animal
是由工厂 return 编辑的,但是当关联对象实例化时 Animal
它们return子class.
示例:
expect(zoo.animal).to eq(animal)
失败:
expected: #<Cat:0x007fa01a8cd360 same_other_attributes...>
actual: #<Animal:0x007fa01b8d33b8 same_other_attributes...>
有什么方法可以将 Animal
工厂更改为 return 其子 class 的实例?
我确实尝试在工厂创建后在 Animal
上调用 .reload
,但它没有触发重新加载新的(子)class。我知道通常你可以调用 superclass.becomes!(subclass)
来强制更改,但不知道如何将其放入 FactoryGirl
回调中,实际上 return 转换后的对象。
您可以使用 initialize_with
强制超类工厂 return 子类的实例
例如:
initialize_with do
klass = type.constantize
klass.new(attributes)
end
简化示例:
我最近在 Animal
模型上安装了 Single Table Inheritance
。 Cat
和 Dog
是 Animal
的子 class。
我有一个 Animal
工厂:
factory :animal do
type { ["Dog","Cat"] }.sample
end
在我的测试套件中几乎所有地方我都调用
let(:animal) { Factory.create(:animal) }
因为 Animal
的类型与测试无关。自从转向 STI 以来,我在对这些动物执行相等性检查时遇到错误,因为超级 class Animal
是由工厂 return 编辑的,但是当关联对象实例化时 Animal
它们return子class.
示例:
expect(zoo.animal).to eq(animal)
失败:
expected: #<Cat:0x007fa01a8cd360 same_other_attributes...>
actual: #<Animal:0x007fa01b8d33b8 same_other_attributes...>
有什么方法可以将 Animal
工厂更改为 return 其子 class 的实例?
我确实尝试在工厂创建后在 Animal
上调用 .reload
,但它没有触发重新加载新的(子)class。我知道通常你可以调用 superclass.becomes!(subclass)
来强制更改,但不知道如何将其放入 FactoryGirl
回调中,实际上 return 转换后的对象。
您可以使用 initialize_with
例如:
initialize_with do
klass = type.constantize
klass.new(attributes)
end