工厂女孩:创建vs构建,需要不同的行为

时间:2012-01-06 13:43:51

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

我需要的是在Factory.define块中的一种方法,以了解工厂是否已使用create或build进行调用,无论是显式还是仅使用默认策略。

我有一个工厂,必须手动调整代码的原始作者到目前为止可以管理正常创建barfs和正常构建的关联。我不想在构建案例中调整这些关联,但我必须在创建案例中。

我一直在寻找是否有类似于'current_strategy'的东西,但我还没有看到任何东西。我知道我可以使用after_create与after_build进行区分,但是原作者做了这样的事情,以便在不进行调整的情况下保存对象的行为会导致大量的不幸 - 在数据库中保存异常和垃圾。

我目前无权修复他所写的“模型”,现有的rspec测试使用差异化来随时做正确的事情。在每种情况下,先前的测试作者都选择从不使用create,这意味着设置大多数测试数据是一个神秘而漫长的过程。

任何帮助都会深深感激 - 我仍然在锻炼我的GoogleFu但是很想被短路......

哦,这是在Rails 2(/ cry)

谢谢!

1 个答案:

答案 0 :(得分:1)

这听起来确实是一个非常奇怪的问题,但是既然你说你正在清理别人的代码,我会认为没有简单的方法。

我不会从工厂那里接近这个。工厂不应该关心,因为模型(不是工厂)在对象结构和关联方面应该是有效的守门人。

我会编写分别为createbuild个对象的规范,并测试它们的关联以确保它们是正确的(根据您希望新行为最终是)。然后,通过重构模型来完成这些规范,以完成您实际需要它们执行的操作。这就是清理遗留代码并改变其行为的方法 - 编写将在新功能正确时通过的测试,并重构直到它们通过,每次测试/重构都进行渐进式更改。

当你的新规格通过时,你就可以了。如果前一作者提出了他们自己的规范验证以前的行为,那么你将不得不确定哪些测试目前是有效的(如果有的话)(其中很多可能是,因为它们代表了应用程序当前正在履行),并删除那些不是。