使用FactoryGirl / rspec避免长外键链

时间:2015-12-09 22:43:25

标签: ruby-on-rails rspec factory-bot

简短版本:我的数据库中的表之间有一长串外键,所有必需/非空,这意味着我必须在工厂女孩的7个不同表中创建记录,我不需要其中大部分内容的背景。这有什么好办法吗?

长版本:我正在为一家进行商品推销的公司构建应用程序。所以,例如。 Smiths Chips打电话给他们说'我们有一个新的夏季烧烤'味道,并希望在澳大利亚的这200家Coles商店内建立过道式功能显示器#34;该公司组织临时工在各自的商店进行这项工作。

命名法:
"工作" 是总体要求 - 例如"建立过道夏季烧烤展示结束"。工作有很多任务 "任务" 是员工在单个商店中实施的工作。
因此,任务属于员工和商店。

长外键链是:任务>商店>郊区>邮政编码>分区域>区域>状态

在测试Job和Task模型时,我需要创建Tasks,这意味着在其他6个表中创建记录,我宁愿避免这些记录。

2 个答案:

答案 0 :(得分:2)

由于你有外键并且它们在你的数据库中不是空的,我的建议是为你的测试禁用外键检查,然后用任何东西填充你的外键。这样,如果测试不需要,则无需创建相关的db记录。

以下是RSpec

中如何做到这一点的一个很好的例子

https://gist.github.com/myronmarston/61380bb4500b4d85dd3f

SQLite的语法是PRAGMA foreign_keys = OFF; / PRAGMA foreign_keys = ON;

答案 1 :(得分:1)

你可以打破任务 - >使用连接表存储外键。 store_tasks实际上只包含两个外键:一个用于任务,一个用于存储。

所以你最终会得到Task< - StoreTask - >商店 - > ...

通过这种方式,您可以独立地使用任务测试所需的任何内容。

唯一的缺点是,你可以代表一个孤儿'数据库中的任务。这是不太理想的(反对使其无法代表非法国家),但我认为比根据Rob建议禁用你的规范中的所有外键更少问题。

我总是使用我在生产中使用的相同数据库进行测试。数据库具有不同的强制规则和语义,并且可以在生产失败的情况下通过测试。我有时喜欢也能够使用特定于数据库的功能:Postgres非常支持JSON,窗口函数,全文搜索等,我宁愿拥抱而不是瞄准最低的共同点。拥有一个不同的测试数据库意味着你无法真正做到这一点。