在 Travis 上测试 Actionmailer-CI
Testing Actionmailer on Travis-CI
我在 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 环境中设置,因为凭证文件中的变量在那里不可用。
我在 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 环境中设置,因为凭证文件中的变量在那里不可用。