ruby-on-rails - RSpec/FactoryGirl - Rails STI - 平等

标签 ruby-on-rails rspec factory-bot single-table-inheritance

简化示例:

我最近设置了 Single Table InheritanceAnimal 上模型。 CatDogAnimal 的子类.

我有一个 Animal工厂 : factory :animal do type { ["Dog","Cat"] }.sample end

我调用的测试套件中几乎所有地方 let(:animal) { Factory.create(:animal) }因为 Animal 的类型与测试无关。自从转向 STI 以来,我在对这些动物执行相等性检查时遇到错误,因为父类(super class) Animal由工厂返回,但当关联对象实例化时 Animal他们返回子类。

例子: expect(zoo.animal).to eq(animal)失败: expected: #<Cat:0x007fa01a8cd360 same_other_attributes...> actual: #<Animal:0x007fa01b8d33b8 same_other_attributes...>

有什么办法可以改变 Animal工厂返回其子类的实例?

我试过调用.reloadAnimal 上在工厂创建它但它没有触发重新加载新的(子)类之后。我知道通常你可以打电话superclass.becomes!(subclass)强制更改但不知道如何将其放入 FactoryGirl以实际返回转换后的对象的方式进行回调。

最佳答案

您可以使用 initialize_with 强制父类(super class)工厂返回子类的实例

例如:

initialize_with do
  klass = type.constantize
  klass.new(attributes)
end

关于ruby-on-rails - RSpec/FactoryGirl - Rails STI - 平等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43959977/

相关文章:

ruby-on-rails - rspec 测试 Controller 后将我的参数从符号更改为字符串并破坏我的测试

ruby-on-rails - 在 CSS 中访问 Rails Controller 实例变量

mysql - 将 MySQL 与 Rails 结合使用(15 分钟内构建博客)

rspec - 在参数化 puppet 模块中 rspec 测试子类的最佳方法是什么

ruby-on-rails - FactoryBot 工厂中 `transient do` block 的用途是什么?

rspec - 未定义的方法'create'规范。

ruby-on-rails - 类定义中的方法调用?

rspec - 设计和 RSpec : Accessing current_user in specs

ruby-on-rails - 测试schema.org ld+json内容

ruby-on-rails - 工厂女孩中非事件记录协会的问题