Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails RSpec/FactoryGirl-Rails STI-平等_Ruby On Rails_Rspec_Factory Bot_Single Table Inheritance - Fatal编程技术网

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指设置子类的literal
type
列。
initialize_with do
  klass = type.constantize
  klass.new(attributes)
end