作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为我的应用程序创建测试。
创建 quotation_request 后,我会向用户发送一封确认电子邮件。我还发了一封电子邮件通知校对人员。
我仍在学习 Ruby,我确信有更好的方法来编写以下代码:
def email_exists?(email_address)
ActionMailer::Base.deliveries.each do |m|
if m[:to].to_s == email_address
return true
end
end
end
def email_with_subject_exists?(email_address, email_subject)
ActionMailer::Base.deliveries.each do |m|
if m[:to].to_s == email_address && m[:subject].to_s == email_subject
return true
else
return false
end
end
end
我发现,如果我不包含 return false,那么出于某种原因,电子邮件的全部内容都会得到输出。
任何改进此代码的帮助将不胜感激。
以下是 ActionMailer::Base.deliveries 的内容:
[#<Mail::Message:70094817191440, Multipart: true, Headers: <Date: Thu, 01 Sep 2016 15:50:35 +0700>, <From: from@example.com>, <To: peterjohnson1@example.com>, <Message-ID: <57c7ebdb1b5f4_2ab93fc03545e1f850559@Mitchell-Goulds-MacBook-Air.local.mail>>, <Subject: Welcome to the ProvenWord team!>, <Mime-Version: 1.0>, <Content-Type: multipart/alternative; boundary="--==_mimepart_57c7ebdb16e49_2ab93fc03545e1f85046d"; charset=UTF-8>, <Content-Transfer-Encoding: 7bit>>, #<Mail::Message:70094829223120, Multipart: true, Headers: <Date: Thu, 01 Sep 2016 15:50:35 +0700>, <From: from@example.com>, <To: peterjohnson2@example.com>, <Message-ID: <57c7ebdb23188_2ab93fc03545e1f850725@Mitchell-Goulds-MacBook-Air.local.mail>>, <Subject: Welcome to the ProvenWord team!>, <Mime-Version: 1.0>, <Content-Type: multipart/alternative; boundary="--==_mimepart_57c7ebdb229aa_2ab93fc03545e1f8506be"; charset=UTF-8>, <Content-Transfer-Encoding: 7bit>>, #<Mail::Message:70094772574660, Multipart: true, Headers: <Date: Thu, 01 Sep 2016 15:50:35 +0700>, <From: from@example.com>, <To: peterjohnson3@example.com>, <Message-ID: <57c7ebdb28936_2ab93fc03545e1f850960@Mitchell-Goulds-MacBook-Air.local.mail>>, <Subject: Welcome to the ProvenWord team!>, <Mime-Version: 1.0>, <Content-Type: multipart/alternative; boundary="--==_mimepart_57c7ebdb27bf6_2ab93fc03545e1f850835"; charset=UTF-8>, <Content-Transfer-Encoding: 7bit>>, #<Mail::Message:70094829778220, Multipart: true, Headers: <Date: Thu, 01 Sep 2016 15:50:35 +0700>, <From: from@example.com>, <To: peterjohnson4@example.com>, <Message-ID: <57c7ebdb2c982_2ab93fc03545e1f85116b@Mitchell-Goulds-MacBook-Air.local.mail>>, <Subject: Welcome to the ProvenWord team!>, <Mime-Version: 1.0>, <Content-Type: multipart/alternative; boundary="--==_mimepart_57c7ebdb2c064_2ab93fc03545e1f85104b"; charset=UTF-8>, <Content-Transfer-Encoding: 7bit>>, #<Mail::Message:70094829991680, Multipart: true, Headers: <Date: Thu, 01 Sep 2016 15:50:35 +0700>, <From: from@example.com>, <To: peterjohnson5@example.com>, <Message-ID: <57c7ebdb30c2b_2ab93fc03545e1f85135c@Mitchell-Goulds-MacBook-Air.local.mail>>, <Subject: Welcome to the ProvenWord team!>, <Mime-Version: 1.0>, <Content-Type: multipart/alternative; boundary="--==_mimepart_57c7ebdb30465_2ab93fc03545e1f85123c"; charset=UTF-8>, <Content-Transfer-Encoding: 7bit>>, #<Mail::Message:70094777280260, Multipart: true, Headers: <Date: Thu, 01 Sep 2016 15:50:35 +0700>, <From: from@example.com>, <To: johnpeters@example.com>, <Message-ID: <57c7ebdbb8421_2ab93fc03545e1f8515e5@Mitchell-Goulds-MacBook-Air.local.mail>>, <Subject: Your ProvenWord quotation request has been delivered>, <Mime-Version: 1.0>, <Content-Type: multipart/alternative; boundary="--==_mimepart_57c7ebdbb76fa_2ab93fc03545e1f8514ee"; charset=UTF-8>, <Content-Transfer-Encoding: 7bit>>]
最佳答案
我通常这样做(这是用 RSpec)
it "sends correct email" do
UserMailer.welcome_email(user).deliver
ActionMailer::Base.deliveries.last.tap do |mail|
expect(mail.from).to eq(["myapp@awesome.com"])
expect(mail.subject).to eq("Welcome #{user.name}")
end
end
编辑:
有几种方法可以做到这一点。我个人喜欢将发送的内容和消息包含的内容分开。
Controller(最好)/Model(可能) Action 是这样的:
def something
Mailer.a(item).deliver
Mailer.b(item).deliver
end
测试发送正确的电子邮件:
it "sends correct number of emails" do
expect do
## Trigger your stuff here (#something above)
end.to change{ ActionMailer::Base.deliveries.size }.by(2)
end
EDIT2:^^this^^ 实际上不会测试是否发送了 正确 两封电子邮件。为此,您可以执行类似 ActionMailer::Base.deliveries.map{|e| 的操作e[:subject]}.sort == ["asubject", "bsubject"].sort
但是当你改变主题时,这很简单。由你决定你想在这里做什么/测试。 (也可以看成 assert Mailer.recieves(:a).with(obj)
(我忘记了确切的语法,我不知道你使用的是什么测试框架,但它们都有类似的东西。 )
测试邮件内容是否正确
it "Mailer#a has correct email content" do
Mailer.a(user).deliver
ActionMailer::Base.deliveries.last.tap do |mail|
expect(mail.from).to eq(["myapp@awesome.com"])
expect(mail.subject).to eq("Welcome #{user.name}")
end
end
## repeat for Mailer#b
关于ruby - 如何从 ActionMailer::Base.deliveries 获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39262613/
我是一名优秀的程序员,十分优秀!