kit*_*nky 3 rspec ruby-on-rails single-table-inheritance factory-bot
简化示例:
我最近设置Single Table Inheritance了一个Animal模型.Cat并且Dog是.的子类Animal.
我有一家Animal工厂:
factory :animal do
type { ["Dog","Cat"] }.sample
end
我调用的测试套件几乎无处不在,
let(:animal) { Factory.create(:animal) }因为类型Animal与测试无关.由于移动到STI,我在这些动物上执行相等性检查时出错,因为超类Animal是由工厂返回的,但是当关联对象实例化时,Animal它们返回子类.
示例:
expect(zoo.animal).to eq(animal)失败:
expected: #<Cat:0x007fa01a8cd360 same_other_attributes...>
actual: #<Animal:0x007fa01b8d33b8 same_other_attributes...>
有没有办法可以更改Animal工厂以返回其子类的实例?
我曾尝试致电.reload该Animal工厂创建之后,但它并没有引发重装新(子)类.我知道通常你可以调用superclass.becomes!(subclass)强制更改,但不知道如何以FactoryGirl实际返回转换对象的方式将其放入回调中.
您可以强制超类工厂使用返回子类的实例 initialize_with
例如:
initialize_with do
klass = type.constantize
klass.new(attributes)
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
398 次 |
| 最近记录: |