我在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/environments/test.rb
中的config.action_mailer.delivery_method = :test
仍然有效。
我想到的另一个可能的解决办法是尝试禁用Travis的特定测试,但这并不令人满意。有人能说明问题出在哪里吗?
最终找到了答案:
config.action_mailer.perform_deliveries = false
仅在Travis环境中设置,因为凭据文件中的变量在那里不可用。