问:如何使用 Turnip、capybara 和 Gherkin 测试 ActionMailer Deliver_later

Posted

技术标签:

【中文标题】问:如何使用 Turnip、capybara 和 Gherkin 测试 ActionMailer Deliver_later【英文标题】:Q:How to test ActionMailer deliver_later with Turnip,capybara and Gherkin 【发布时间】:2019-03-16 01:12:36 【问题描述】:
def deliver_mail
  ServiceMailer.activation().deliver_later
end

deliver_mail 方法是从某个控制器调用的。

我想像下面这样进行测试 - 使用黄瓜和水豚进行功能测试。

step 'push next button' 执行 查找(“输入。提交”)。点击 结束

Feature: Sending a mail to user
  Scenario: mail to a user
    When I push next button
    Then mail should be sent to a user

实际上,当按下'push next button'时,邮件是通过deliver_mail方法发送的。

当我使用deliver_now 而不是deliver_later 时,我可以测试上面的代码。

但是我将deliver_now改为deliver_later后,我无法测试。

所以我在下面引用。

http://chriswarren.github.io/rpsec/testing/2015/03/13/testing-emails-and-active-job-in-rspec-feature-tests.html

我尝试在规范文件中包含“ActiveJob::TestHelper”,例如“include ActiveJob::TestHelper”。

我修改了这样的步骤文件。

step 'push next button' do
  perform_enqueued_jobs do
    find("input.submit").click
  end
end

但还是不行。

请提供任何提示和建议。

【问题讨论】:

那么如何测试邮件是否已发送?使用expect 语句向我们展示您的测试代码。 我添加了使用萝卜的期望语句。 【参考方案1】:

我建议不要在测试中延迟作业,然后检查应该运行的任何 DJ 的结果。

# rails_helper.rb

Delayed::Worker.delay_jobs = false

【讨论】:

【参考方案2】:

我正在使用 Delayed::Job 在后台发送电子邮件,所以当我测试发送电子邮件时,我有两种不同的测试:

1) rspec - 检查邮件正文(一般是邮件程序内部的方法)并发送邮件本身

2) cucumber - 检查电子邮件作业是否已排队

在黄瓜中,我有以下代码:

Then(/^A welcome email will be sent$/) do
  expect(Delayed::Job.count).to eq(1)
end

我认为没有必要从黄瓜中检查其他任何东西。

【讨论】:

以上是关于问:如何使用 Turnip、capybara 和 Gherkin 测试 ActionMailer Deliver_later的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Capybara 中设置会话值?

如何在 rspec 中使用 capybara 点击下拉选项

如何使用 Capybara 和 ChromeDriver 在输入字段中模拟输入?

如何在测试之间重复使用 Capybara 会话?

如何使用 capybara 访问电子邮件中的链接

Capybara -> 如何使用本地方法的结果