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
如果您必须进行更改以区分这两封电子邮件,那么这种方法是未来的证明,并且任何拿起代码的开发人员都不会走入死胡同,而杂散的电子邮件从它们中隐藏起来模型。
我有两个创建用户的控制器,在创建时,我想给他们发一封电子邮件。由于 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
如果您必须进行更改以区分这两封电子邮件,那么这种方法是未来的证明,并且任何拿起代码的开发人员都不会走入死胡同,而杂散的电子邮件从它们中隐藏起来模型。