Rspec:测试以确保不发送电子邮件

时间:2015-12-23 02:18:38

标签: ruby-on-rails rspec

我正在运行测试以确保不会将电子邮件发送给某些用户:

it "does not send reminders to users who are not subscribed" do
        expect(ReminderMailer).not_to receive(:send_reminder).with("whatever", user.id).and_return(double(deliver_now: true))
        book.send_reminders("whatever", user.id)
      end

Book.rb

def send_reminders(medium, user_id)
    ReminderMailer.send_reminder(medium, user_id).deliver_now
end

但目前的测试是:

  负面消息预期不支持

and_return

如果我删除了and_return部分:

it "does not send reminders to users who are not subscribed" do
        expect(ReminderMailer).not_to receive(:send_reminder).with("whatever", user.id)
        book.send_reminders("whatever")
      end

然后测试失败,因为:

  

未定义的方法`deliver_now'代表nil:NilClass

如何测试具有特定参数的动作邮件程序方法

1 个答案:

答案 0 :(得分:4)

您的代码存在一些问题:

  1. 传递给方法send_reminders的参数数量似乎是错误的(您只传递了一个参数'无论如何'但没有用户ID)

  2. 我没有看到过滤用户的条件,是ReminderMailer的方法send_reminder吗?所以无论如何它会调用send_reminder,只是不会发送邮件,对吧?这不是你所期望的。

  3. 如果是这样,你可以试试这个:

    expect {
      book.send_reminders("whatever")
    }.not_to change(ActionMailer::Base.deliveries, :count)
    

    预计实际上不会发送任何邮件。祝你好运兄弟!