【问题标题】:How should I test "after_create" callback for sending email with rspec我应该如何测试“after_create”回调以使用 rspec 发送电子邮件
【发布时间】:2014-07-29 16:11:09
【问题描述】:

我的问题是关于如何指定回调以正确方式发送电子邮件。

我有一个名为Question 的模型。创建question 后,我有一个回调after_create 来发送电子邮件。

我想创建一个 rpsec 来测试这个方法。但是,我已经为每个 Mailer 制定了规范,用于验证电子邮件是否实际发送以及收件人。

所以,我想知道在after_create 中是否应该测试send_mail 方法的调用或检查最后发送的电子邮件是否存在?因为,就像我说的,电子邮件本身的测试在邮件spec/mailers/question_mailer_spec.rb的规范中

型号:

class Question < ActiveRecord::Base

after_create :send_email

def send_email
   QuestionMailer.send_email(:questioned, self.id)
end

Rspec:

describe "#send_email" do
  it "should sends email after create" do
     expect(QuestionMailer).to receive(:send_email).with(:questioned, **question.id**) 
     question = create(:question)

  end
end

谢谢!

【问题讨论】:

标签: ruby-on-rails rspec


【解决方案1】:

您应该测试对send_email的调用。

您想要断言实现的行为,而不是实现本身。在这种情况下,消息从Question 发送到其协作者QuestionMailer。请记住,测试接口,而不是实现细节。

Question 不知道电子邮件是如何发送的。它委托给QuestionMailer。因此,检查最后发送的电子邮件、电子邮件队列等是没有意义的。

我建议您花时间观看 Sandi Metz 在 RailsConf 2013 上的精彩演讲:The Magic Tricks of Testing。幻灯片是here

最好的!

更新:如何处理self.id

我认为如果你通过self 而不是self.id 会更好。除了解决你的问题,它:

  • 让您的代码更具表现力;
  • 避免使用原始值(整数);
  • 可能会阻止在您的生产代码中至少再读取一次数据库。

如果您真的想/需要坚持使用self.id,您可以stub 正在测试的Question 实例中的任何值。请记住,您是单元测试 #send_mail,因此id 的值是存根还是由数据库生成并不重要。而且您访问数据库的次数越少,您的测试运行速度就越快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    相关资源
    最近更新 更多