Lon*_*don 2 ruby email rspec ruby-on-rails
这是我目前失败的测试:
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
Run Code Online (Sandbox Code Playgroud)
这是我的邮件位:
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
Run Code Online (Sandbox Code Playgroud)
我如何测试是发送给两个用户的邮件?
首先,您应该确保他们有不同的电子邮件地址.
假设你的工厂处理那个(你见过Faker宝石吗?)那么你可以测试上次发送的消息中发送的内容,如下所示:
# The last email sent
ActionMailer::Base.deliveries.last
Run Code Online (Sandbox Code Playgroud)
您可以检查是否发送了正确数量的消息:
ActionMailer::Base.deliveries.count
Run Code Online (Sandbox Code Playgroud)
所以你的测试看起来像这样:
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
Run Code Online (Sandbox Code Playgroud)
你可以用一些辅助宏来使这个更好一些.有关如何执行此操作的详细信息,请参阅此railscast:
http://railscasts.com/episodes/275-how-i-test