ruby-on-rails - Rails,RSpec : How to test, 触发特定的邮件操作

标签 ruby-on-rails rspec

我需要确保运行导入程序会发出电子邮件。

这是我到目前为止得到的:

describe '#import' do
  it 'triggers the correct mailer and action', :vcr do
    expect(OrderMailer).to receive(:delivery_confirmation).with(order)

    Importer.new(@file).import
    remove_backed_up_file
  end
end

它失败了:

pry(#<ActiveRecord::ConnectionAdapters::TransactionManager>)> error
=> #<NoMethodError: undefined method `deliver_now' for nil:NilClass>

这显然是行不通的,因为我期望 Mailer 类接收(实例)方法调用。但是我如何才能获得将接收调用的邮件程序实例呢?您将如何测试单元的方法是否触发特定的邮件程序?

最佳答案

我假设实际上的delivery_confirmation方法返回一个Mail对象。问题是 ActionMailer 将调用邮件对象的 deliver 方法。您已设置了一个期望来消除 delivery_confirmation 方法,但尚未指定返回值。试试这个

mail_mock = double(deliver: true)
# or mail_mock = double(deliver_now: true)
expect(mail_mock).to receive(:deliver)
# or expect(mail_mock).to receive(:deliver_now)
allow(OrderMailer).to receive(:delivery_confirmation).with(order).and_return(mail_mock)
# the rest of your test code

关于ruby-on-rails - Rails,RSpec : How to test, 触发特定的邮件操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42551997/

相关文章:

ruby-on-rails - 如何使用用户 ID rails 4 在产品表中插入数据

ruby-on-rails - 工厂女孩/Rails : Generator to create a factory for existing model?

ruby - 如何使用 FactoryBot 定义关联工厂?

ruby-on-rails - RSpec:检查是否已保存任何模型

ruby-on-rails - 为此关系创建迁移

css - Rails 4 - 预编译 Assets 破坏了我的 Bootstrap 下拉菜单

javascript - 测试单击输入字段并生成文本选择

ruby-on-rails - Rails 4:使用 RSpec 测试 rake 任务时的 PG::InFailedSqlTransaction

testing - 调用我在 before block 中测试的方法是不好的做法吗?

mysql - Ruby on Rails - 来自 ActiveRecord 的 MySQL 中的 UTF8 编码问题