【问题标题】:Rails: Testing the on_create callback only onceRails:仅测试一次 on_create 回调
【发布时间】:2015-03-02 12:59:23
【问题描述】:

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

我的一些可能的想法:

  • 我可以模拟这种行为,但我需要一直模拟它......
  • 我可以将其设为参数(例如,仅当应发送电子邮件时才为 true 的布尔值),但我只会添加此参数用于测试

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

【问题讨论】:

  • 最简洁的方法可能是使用模型回调,而是将用户创建包装在单独的类/模块/方法中。在那里,您可以显式生成电子邮件(您在测试中不会这样做)

标签: ruby-on-rails activerecord rspec


【解决方案1】:

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

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

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

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

如果您必须进行更改以区分这两个电子邮件,这种方法是未来的证明,并且任何拾取代码的开发人员都不会走上死胡同摸索,而杂散的电子邮件会从它们中消失并隐藏在模型中.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    相关资源
    最近更新 更多