2015-03-02 84 views
0

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

一些可能的想法我有:

  • 我可以模拟出这种行为,但后来我需要模拟这一切的时候...
  • 我可以使它的参数(例如一个布尔值,只有当电子邮件应该被发送时才是真的),但是我只会添加这个测试

这样做的最干净的方法是什么?

+1

最简洁的方法可能是*不使用模型回调,而是将用户创建封装在单独的类/模块/方法中。在那里,你可以明确地生成电子邮件(然后你不会在你的测试中做) – 2015-03-02 13:06:15

回答

0

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

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

在你控制器测试,您可以检查邮件交付:

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

这种方法是面向未来的,你应该要做出改变来区分这两个电子邮件和谁拿起任何开发人员代码不会沿着盲目的胡同走下去,而迷离的电子邮件从模型中隐藏起来。