我在Rails模型中得到了一些这样的代码。
after_update :email_edits
def email_edits
EditsMailer.with(record_id: id, user_id: user.id).record_modified.deliver_later
end
这很容易在本地进行单元测试,比如...
email = EditsMailer.with(record_id: records(:one).id,
user_id: users(:one).id).record_modified
assert_emails 1 do
email.deliver_now
end
...但是,当这些代码被推送到Travis-CI并运行测试时,不可避免的结果是。
1 emails expected, but 0 were sent.
Expected: 1
Actual: 0
集成测试也会失败
我看到一些建议,比如测试邮件是否被添加到ActiveJob队列中,或者是超额完成 deliver_later
以致于 deliver_now
在测试中使用,但我已经在使用 deliver_now
但还是失败了。 即使Travis不允许发送邮件,我也会认为 config.action_mailer.delivery_method = :test
在 config/environments/test.rb
仍然有效。
我想到的另一个可能的解决方法是尝试在Travis上禁用那些特定的测试,但这将是不满意的。有谁能建议一下,问题可能出在哪里?
最终找到了答案。
config.action_mailer.perform_deliveries = false
只有在Travis环境下才会被设置,因为凭证文件中的变量在那里不可用。