夹具会触发模型回调吗?
Posted
技术标签:
【中文标题】夹具会触发模型回调吗?【英文标题】:Do fixtures trigger model callbacks? 【发布时间】:2010-11-16 10:10:23 【问题描述】:假设我有一个 User 模型,在 User.rb 中有以下代码:
before_create :create_dependencies
after_create :build_inbox
我还有一个 users.yml 文件,其中定义了一堆用户设备。
当我运行 rake db:fixtures:load 时,它似乎不会触发回调。
-
这是预期的工作方式吗?如果是这样,他们为什么要这样设计?
有没有办法在加载夹具时强制触发回调?
【问题讨论】:
【参考方案1】:这是预期的工作方式吗?如果 那么,他们为什么要这样设计呢?
是的,灯具不使用回调。我假设这是出于性能原因。在不实例化模型的情况下直接将数据加载到数据库中会更快。
有没有办法强制触发 加载时的回调 固定装置?
我不知道。你有几个选择。一种是构建您的固定装置,就好像回调已经被触发一样。也就是说,手动创建回调将要的数据。例如,如果您有一个对用户密码进行哈希处理的回调,您需要手动对密码进行哈希处理,然后将该哈希存储在夹具中。
第二种解决方案(强烈推荐!)是使用工厂。工厂确实会触发回调并允许您使用虚拟属性等。这是因为它们每次都会实例化模型。一种流行的宝石是Factory Girl。另一个可以尝试的是Machinist。我还为此主题创建了Railscasts episode。
【讨论】:
+1 给工厂女孩。大约 2 个月前切换到它,我再也没有回头。 +1 因为工厂女孩太棒了...花一个小时来学习它,你会很快弥补你失去的时间。 您也可以在用户是您的固定装置的情况下执行类似的操作。user._run_create_callbacks
【参考方案2】:
我也有这个问题。我们的应用程序在 before_save 之前计算了一些总数,因此不必即时完成。加快报告速度并减少某些报告的连接。
在这些对象的测试中,我们手动运行回调,如下所示:
before do
order.perform_callbacks
end
这很有效,因为它不会一直运行,因此其他测试不会受到影响。
顺便说一句,我们正在使用 minitest 和固定装置。
【讨论】:
这段代码在哪里?夹具顶部?什么是秩序? 你好坏蛋。该代码位于我的测试文件的顶部,在 stmt 之前,因为在这种情况下,我需要它用于该文件中的每个测试。如果您只需要确保回调运行 1 次测试,您可以将 .perform_callbacks 放在该特定测试中。 什么是order
,一个类,一个实例?奇怪的是,我在任何地方都找不到 perform_callbacks
记录。以上是关于夹具会触发模型回调吗?的主要内容,如果未能解决你的问题,请参考以下文章
我可以在破折号情节回调中使用多个输入,但只有一个触发回调吗?
在 Android 视图模型中的内部网络更改回调时 LiveData 未触发 - Kotlin