Ruby on rails 如何测试向两个收件人发送电子邮件(Rspec)

Ruby on rails 如何测试向两个收件人发送电子邮件(Rspec),ruby-on-rails,ruby,email,rspec,Ruby On Rails,Ruby,Email,Rspec,这是我目前考试不及格的地方: describe "User request update" do let(:user_one) { FactoryGirl.create(:user) } let(:user_two) { FactoryGirl.create(:user) } let(:mail) { UserMailer.notify_users(user_one, user_two) } it "should notify both users" do

这是我目前考试不及格的地方:

describe "User request update" do
    let(:user_one) { FactoryGirl.create(:user) }
    let(:user_two) { FactoryGirl.create(:user) }
    let(:mail) { UserMailer.notify_users(user_one, user_two) }  

    it "should notify both users" do
      mail.to.should include(user_one.email)
      mail.to.should include(user_two.email)
    end
  end
这是我的邮件地址:

def notify_users(requestor, user)
    [requestor, user].each{ |u| notify_user(requestor, u) }  
  end

def notify_user(requestor, user)
  @requestor = requestor
  @user = user
  mail :to => user.email, :subject => "User requested update"
end

如何测试邮件是否发送给两个用户?

首先,您应该确保他们有不同的电子邮件地址

假设您的工厂处理过(您见过
冒牌货
gem吗?),那么您可以测试上次发送的消息中发送的内容,如下所示:

# The last email sent 
ActionMailer::Base.deliveries.last
describe "User request update" do
  let(:user_one) { FactoryGirl.create(:user) }
  let(:user_two) { FactoryGirl.create(:user) }
  # let(:mail) { UserMailer.notify_users(user_one, user_two) } 

  # If your method sends two separate emails:
  it "#notify_users should notify both users" do
    UserMailer.notify_users(user_one, user_two)
    expect(ActionMailer::Base.deliveries.count).to eq(2)
    expect(ActionMailer::Base.deliveries[0].to).to include(user_one.email)
    expect(ActionMailer::Base.deliveries[1].to).to include(user_two.email)
  end

  # If your method sends a single email with both recipients
  it "#notify_users should notify both users" do
    UserMailer.notify_users(user_one, user_two)
    expect(ActionMailer::Base.deliveries.count).to eq(1)
    expect(ActionMailer::Base.deliveries.last.to).to include(user_one.email)
    expect(ActionMailer::Base.deliveries.last.to).to include(user_two.email)
  end
end
您可以检查发送的邮件数量是否正确:

ActionMailer::Base.deliveries.count
因此,您的测试可能如下所示:

# The last email sent 
ActionMailer::Base.deliveries.last
describe "User request update" do
  let(:user_one) { FactoryGirl.create(:user) }
  let(:user_two) { FactoryGirl.create(:user) }
  # let(:mail) { UserMailer.notify_users(user_one, user_two) } 

  # If your method sends two separate emails:
  it "#notify_users should notify both users" do
    UserMailer.notify_users(user_one, user_two)
    expect(ActionMailer::Base.deliveries.count).to eq(2)
    expect(ActionMailer::Base.deliveries[0].to).to include(user_one.email)
    expect(ActionMailer::Base.deliveries[1].to).to include(user_two.email)
  end

  # If your method sends a single email with both recipients
  it "#notify_users should notify both users" do
    UserMailer.notify_users(user_one, user_two)
    expect(ActionMailer::Base.deliveries.count).to eq(1)
    expect(ActionMailer::Base.deliveries.last.to).to include(user_one.email)
    expect(ActionMailer::Base.deliveries.last.to).to include(user_two.email)
  end
end
您可以使用一些辅助宏使其变得更好。有关如何执行此操作的详细信息,请参见本railscast:


在测试中使用
let(:mail)
然后使用
mail.to
是个坏主意。。。您将在该测试中发送两次通知,但这不是您要测试的内容。@Jon这不是真的
记忆结果,因此如果您第二次调用
邮件
,它只会返回结果,而不会重新计算表达式。这里我想指出一个小问题。通过执行
ActionMailer::Base.deliveries[0]
ActionMailer::Base.deliveries[1]
,您将测试与
deliveries
数组中的电子邮件顺序相耦合。我不确定那个订单是否可信。