Ruby on rails RSpec/FactoryGirl-Rails STI-平等
简化示例: 我最近在一个Ruby on rails RSpec/FactoryGirl-Rails STI-平等,ruby-on-rails,rspec,factory-bot,single-table-inheritance,Ruby On Rails,Rspec,Factory Bot,Single Table Inheritance,简化示例: 我最近在一个动物模型上设置了单表继承Cat和Dog是Animal的子类 我有一个动物工厂: 工厂:动物吗 类型{[“狗”,“猫”]}。示例 结束 在我的测试套件中,几乎所有我调用的地方 let(:animal){Factory.create(:animal)}因为animal的类型与测试无关。由于转移到STI,我在对这些动物执行相等性检查时遇到错误,因为超类Animal由工厂返回,但当关联对象实例化Animal时,它们返回子类 例如: expect(zoo.animal)。均衡(
动物
模型上设置了单表继承
Cat
和Dog
是Animal
的子类
我有一个动物
工厂:
工厂:动物吗
类型{[“狗”,“猫”]}。示例
结束
在我的测试套件中,几乎所有我调用的地方
let(:animal){Factory.create(:animal)}
因为animal
的类型与测试无关。由于转移到STI,我在对这些动物执行相等性检查时遇到错误,因为超类Animal
由工厂返回,但当关联对象实例化Animal
时,它们返回子类
例如:
expect(zoo.animal)。均衡(animal)
失败:
预期:#
实际:#
是否有一种方法可以更改Animal
工厂以返回其子类的实例
在工厂创建了
动物
之后,我尝试调用.reload
,但它没有触发重新加载新(子)类。我知道你通常可以调用superclass.been!(subclass)
强制更改,但不知道如何将其放入FactoryGirl
回调中,从而实际返回转换后的对象。您可以使用initialize\u
强制超类工厂返回子类的实例
例:
您的
动物
声明在动物园
中是什么样子的?您可以更改该声明以返回子类而不是父类。您可以将测试套件更改为{[“Dog”,“Cat”]}。sample.class?@HashRocket有什么帮助@在那个具体的例子中,动物园有一只动物,我测试了一个作业是否正确地设置了动物园的动物。但是,这是不相关的,正如我所提到的,我在整个测试套件中都得到了失败的测试。bc多个测试期望动物
是最初使用FactoryGirl
创建的动物,而现在取而代之的是一只猫
或狗
。我明白为什么,我想知道我是否可以做些什么来确保它们与最初创建的动物
匹配,而不必到处指定类型(特别是当它不重要的时候)。你想从工厂返回动物而不是狗或猫吗?是的。是否要在工厂定义末尾添加.sample.class
<工厂中的code>type指设置子类的literaltype
列。
initialize_with do
klass = type.constantize
klass.new(attributes)
end