我有一个对象,我们称之为TransitProvider.

它不是ActiveRecord对象.它使用ActiveModel,但其设计目的是从两个单独的表(提供者表和TransitService表)中提取(或持久化)其数据.(理由是:"公交服务Provider "的概念是由提供公交服务的Provider 组成的).

因此,除了我try 为TransitProvider构建工厂(使用FactoryBot)时,这一切都很好.

它没有桌子,所以我不能"创建"一个.相反,我需要实际创建底层提供者和TransitService.

但我不知道如何在FactoryBot中做到这一点.

我希望能够做以下事情:

let(:transit_provider) { create(:transit_provider, name: "Some Name") }

让它"隐藏起来"实际创建提供者和TransitService,然后用这两者的数据填充ActiveModel TransitProvider.

帮助

推荐答案

Thoughtbot最近写了一篇关于这个主题的blog post篇文章,FactoryBot的自述中有一节是关于creating factories for non-AR Ruby classes的.值得注意的是,实现依赖于initialize_with使用自定义块实例化工厂,而不是调用new的默认行为,而无需任何关于AR模型的参数.

在您的场景中,我会想象一个TransitProvider工厂,看起来像:

factory :transit_provider do
  provider { create(:provider) }
  transit_service { create(:transit_service) }

  initialize_with { new(provider, transit_service) }
end

同样重要的是要注意,create永远不会适用于上述工厂,因为它试图实例化模型并在数据库中保留记录.你会想换成这个工厂.

Ruby-on-rails相关问答推荐

将两个日期之间的差值转换为Ruby中的iso8601持续时间(如果需要,还可以使用Rails)

无法在 Rails 中使用 wkhtmltopdf 写入临时文件

Ruby Hash 中 tap / delete 和 except 的区别

Rails 7,Hotwire 动态表单,更新值不起作用

组织和/或存储我一直在 RSpec 中使用的模拟对象的最佳方式是什么?

正确更新其他列的更新列

Rails 路由到唯一索引

如何从 Ruby on Rails 应用程序返回正确的 HTTP 错误代码

rails s和bundle exec rails s有什么区别?

撬Ruby 如何重新加载?

Rails:如何访问 RESTful 助手?

Rspec:测试实例变量的赋值

如何配置设计以使用自定义邮箱布局?

Rails 将 form_for 对象传递给部分

水豚 click_link 与 :href 匹配

Rails 助手应该假设实例变量存在还是应该将它们作为参数接收?

Rails,获取模型中的资源路径

Rails 3 SSL 路由从 https 重定向到 http

获取完整的 rails 控制器名称,包括命名空间

Ruby 中的类别名