使用 FactoryGirl 避免长外键链 / rspec
Avoiding long foreign key chains with FactoryGirl / rspec
简短版本:我的数据库中的表之间有一长串外键,都是必需的/不是空的,这意味着我必须在 factory girl 的 7 个不同表中创建记录,在上下文中我不需要他们中的大多数。有什么好的解决办法吗?
长版本:我正在为一家销售公司开发应用程序。所以,例如。 Smiths Chips 打电话给他们说 "We have a new 'Summer BBQ' flavour, and want end-of-aisle feature displays built in these 200 Coles stores across Australia"。这家公司组织临时工在各个商店进行这项工作。
命名法:
"Job" 是总体请求 - 例如 "build end of aisle Summer BBQ displays"。一份工作有很多任务。
a "Task" 是一名员工在单个商店中执行的工作。
因此,Task 属于 Employee 和 Store。
长外键链是:Task > Store > Suburb > Postcode > Subregion > Region > State
在测试作业和任务模型时,我需要创建任务,这意味着在其他 6 个表中创建记录,我希望避免这种情况。
由于您有外键并且它们在您的数据库中不为空,我的建议是为您的测试禁用外键检查,然后用任何内容填充您的外键。这样,如果您的测试不需要相关的数据库记录,您就不需要创建它们。
RSpec
中有一个很好的例子来说明如何做到这一点
https://gist.github.com/myronmarston/61380bb4500b4d85dd3f
SQLite 的语法是 PRAGMA foreign_keys = OFF;
/ PRAGMA foreign_keys = ON;
您可以使用联接 table 中断任务 -> 存储外键。 store_tasks 基本上只包含两个外键:一个用于任务,一个用于存储。
所以你最终会得到 Task <- StoreTask -> Store -> ...
这样您就可以独立地使用任务测试您需要的任何内容。
唯一的缺点是您将能够在数据库中表示 'orphaned' 任务。这不太理想(违背了不可能代表非法状态),但我认为这比按照 Rob 的建议禁用规范中的所有外键问题更小。
我总是使用我在生产中使用的同一个数据库进行测试。数据库具有不同的强制规则和语义,并且有可能在生产中会失败的情况下通过测试。我有时 喜欢 也能够使用数据库特定的功能:Postgres 对 JSON、window 函数、全文搜索等有很好的支持,我宁愿拥抱而不是瞄准最小的公分母。使用不同的数据库进行测试意味着您无法真正做到这一点。
简短版本:我的数据库中的表之间有一长串外键,都是必需的/不是空的,这意味着我必须在 factory girl 的 7 个不同表中创建记录,在上下文中我不需要他们中的大多数。有什么好的解决办法吗?
长版本:我正在为一家销售公司开发应用程序。所以,例如。 Smiths Chips 打电话给他们说 "We have a new 'Summer BBQ' flavour, and want end-of-aisle feature displays built in these 200 Coles stores across Australia"。这家公司组织临时工在各个商店进行这项工作。
命名法:
"Job" 是总体请求 - 例如 "build end of aisle Summer BBQ displays"。一份工作有很多任务。
a "Task" 是一名员工在单个商店中执行的工作。
因此,Task 属于 Employee 和 Store。
长外键链是:Task > Store > Suburb > Postcode > Subregion > Region > State
在测试作业和任务模型时,我需要创建任务,这意味着在其他 6 个表中创建记录,我希望避免这种情况。
由于您有外键并且它们在您的数据库中不为空,我的建议是为您的测试禁用外键检查,然后用任何内容填充您的外键。这样,如果您的测试不需要相关的数据库记录,您就不需要创建它们。
RSpec
中有一个很好的例子来说明如何做到这一点https://gist.github.com/myronmarston/61380bb4500b4d85dd3f
SQLite 的语法是 PRAGMA foreign_keys = OFF;
/ PRAGMA foreign_keys = ON;
您可以使用联接 table 中断任务 -> 存储外键。 store_tasks 基本上只包含两个外键:一个用于任务,一个用于存储。
所以你最终会得到 Task <- StoreTask -> Store -> ...
这样您就可以独立地使用任务测试您需要的任何内容。
唯一的缺点是您将能够在数据库中表示 'orphaned' 任务。这不太理想(违背了不可能代表非法状态),但我认为这比按照 Rob 的建议禁用规范中的所有外键问题更小。
我总是使用我在生产中使用的同一个数据库进行测试。数据库具有不同的强制规则和语义,并且有可能在生产中会失败的情况下通过测试。我有时 喜欢 也能够使用数据库特定的功能:Postgres 对 JSON、window 函数、全文搜索等有很好的支持,我宁愿拥抱而不是瞄准最小的公分母。使用不同的数据库进行测试意味着您无法真正做到这一点。