Rails:仅测试一次 on_create 回调

Rails: Testing the on_create callback only once

我有两个创建用户的控制器,在创建时,我想给他们发一封电子邮件。由于 DRY,我将电子邮件逻辑移至 on_create 回调。但是,现在,每次我在我的 rspec 测试中创建一个用户(例如使用 factorygirl)时,它都会发送一封电子邮件。

我的一些可能想法:

最干净的方法是什么?

最佳做法是从控制器上下文调用电子邮件发送,而不是模型。从框架的角度来看,邮件程序在与视图链接和控制操作流程的方式上与控制器非常相似。

我会将回调逻辑移回到每个控制器中。你是对的,它不是严格的 DRY 但在我看来,这种情况是最可读和最明确的方法,值得交易。

在您的 控制器 测试中,您可以检查邮件是否已送达:

before(:each) { ActionMailer::Base.deliveries = [] }
it "does a thing" do
  subject
  expect(ActionMailer::Base.deliveries.count).to eq 1
end

如果您必须进行更改以区分这两封电子邮件,那么这种方法是未来的证明,并且任何拿起代码的开发人员都不会走入死胡同,而杂散的电子邮件从它们中隐藏起来模型。