gpt4 book ai didi

ruby - 如何从 ActionMailer::Base.deliveries 获取值

转载 作者:行者123 更新时间:2023-12-05 01:45:55 26 4
gpt4 key购买 nike

我正在为我的应用程序创建测试。

创建 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com