Rails测试《十一》添加邮件发送程序及测试邮件发送程序
講到測(cè)試郵件發(fā)送程序,我們首先要讓系統(tǒng)可以發(fā)送郵件。我們先來(lái)給系統(tǒng)添加發(fā)送郵件的功能。
Action Mailer in Rails 3是一個(gè)不錯(cuò)的視頻教程,大家可以參考。
還有就是http://guides.rubyonrails.org/action_mailer_basics.html中更加詳細(xì)的介紹。
?
添加郵件發(fā)送程序
發(fā)送郵件要保證我們有目標(biāo)郵箱,所以呢,我們的用戶要有一個(gè)屬性:email。
還是拿我的blog項(xiàng)目作為練習(xí)項(xiàng)目。
我們?cè)谟脩糇?cè)的時(shí)候給他發(fā)一封郵件。
?
首先我們創(chuàng)建一個(gè)初始化文件
config/initializers/setup_mail.rb,初始化郵箱相關(guān)的信息。
我們使用163的郵箱作為郵件發(fā)送服務(wù)器,需要我們?cè)谏厦嬗幸粋€(gè)注冊(cè)用戶,這里我注冊(cè)一個(gè)woaiguanshui201,密碼是123456asdf。
?
創(chuàng)建郵件發(fā)送程序
然后用rails g mailer命令創(chuàng)建一個(gè)mailer程序。
命令會(huì)創(chuàng)建app/mailers/user_mailer.rb文件。
在里面添加一個(gè)方法,用來(lái)在用戶注冊(cè)的時(shí)候給用戶發(fā)郵件。
?
創(chuàng)建郵件內(nèi)容模板
郵件的內(nèi)容也可以通過(guò)模板來(lái)實(shí)現(xiàn),和controller的action對(duì)應(yīng)有一個(gè)view一樣。我們的mailer的方法也需要一個(gè)view來(lái)做模板。
創(chuàng)建app/views/user_mailer/registration_confirmation.text.erb文件,在文件中寫入下面的內(nèi)容。
?
調(diào)用郵件發(fā)送程序
上下最后一步了,就是在用戶注冊(cè)成功之后,調(diào)用這個(gè)mailer程序的registration_confirmation方法,就可以發(fā)送我們預(yù)定義的模板文件中的內(nèi)容了。
我們把用戶注冊(cè)的方法修改一下,userscontroller的create方法。
UserMailer.registration_confirmation(@user).deliver?
上面這一行是我們新加入的,就是發(fā)郵件用的。
?
這時(shí)候啟動(dòng)我們的服務(wù)rails s,然后注冊(cè)一個(gè)用戶,然后看看用戶的郵箱,就應(yīng)該有了一封從woaiguanshui2012@163發(fā)來(lái)的郵件,標(biāo)題是Registered,內(nèi)容是thank you for registering!。
這就說(shuō)明我們的郵件發(fā)送程序正常工作了。
?
豐富郵件內(nèi)容模板
我們還可以豐富一下郵件的內(nèi)容,比如添加用戶的信息。修改registration_confirmation.text.erb文件。
這就需要我們?cè)趓egistration_comfirmation方法中添加一個(gè)返回的變量@user。
在模板中使用url的話,比如說(shuō)edit_user_url(@user.id, :host => "localhost:3000"),這時(shí)候就只能使用_url方法,不能使用_path方法,同時(shí)還需要指定host。這是因?yàn)猷]件客戶端沒(méi)有web的上下文環(huán)境,不像controller中是有web的上下文環(huán)境的,所以不需要指定host。當(dāng)然,每次指定還是比較麻煩的,你也可以在前面創(chuàng)建的配置文件config/initializers/setup_mail.rb中添加下面的一樣。
這樣就可以省略u(píng)rl中的host參數(shù)了。
?
在郵件中添加附件
再次注冊(cè)用戶,然后登錄用戶的郵箱,就會(huì)發(fā)現(xiàn)收到了一封帶有附件的郵件。
關(guān)于郵件發(fā)送還有很多,大家在使用和設(shè)計(jì)的過(guò)程中會(huì)有更多的體會(huì)。比如說(shuō)我們現(xiàn)在的發(fā)送郵件和用戶注冊(cè)是同步處理的,這樣的話,大量用戶注冊(cè),就會(huì)嚴(yán)重拖慢系統(tǒng),甚至拖垮系統(tǒng)。郵件沒(méi)有必要和用戶注冊(cè)同步處理,可以做成異步的,可以做成獨(dú)立的job。這時(shí)候郵件發(fā)送就需要獨(dú)立出來(lái),可以搞成一個(gè)郵件隊(duì)列,只要在用戶注冊(cè)的時(shí)候發(fā)送一個(gè)郵件消息給郵件隊(duì)列,由隊(duì)列負(fù)責(zé)具體的發(fā)送工作就可以了。
?
測(cè)試郵件發(fā)送程序
關(guān)于郵件測(cè)試有下面幾個(gè)目的
- 郵件正在被處理,創(chuàng)建或者發(fā)送。
- 郵件的內(nèi)容是正確的,包括標(biāo)題,發(fā)送人,body等。
- 在正確的時(shí)間發(fā)送了正確的郵件。
?
可以從兩個(gè)方向來(lái)測(cè)試郵件,一個(gè)是單元測(cè)試,一個(gè)是功能測(cè)試。在單元測(cè)試中,我們?cè)谝粋€(gè)隔離的環(huán)境中運(yùn)行郵件程序,內(nèi)容是受控的,然后和模擬數(shù)據(jù)比較輸出的內(nèi)容。在功能測(cè)試中,我們?cè)赾ontroller和model中正確的使用郵件發(fā)送程序,測(cè)試在正確的時(shí)間發(fā)送了正確的郵件。
默認(rèn)情況下,測(cè)試環(huán)境是不能發(fā)郵件的。他們只會(huì)把郵件加入ActionMailer::Base.deliveries數(shù)組,通過(guò)判斷數(shù)組不為空,就可以知道郵件是否發(fā)送成功。
測(cè)試郵件就是兩件事:
- 測(cè)試郵件是否加入隊(duì)列。
- 測(cè)試郵件內(nèi)容是否正確。
test/unit/user_mailer_test.rb
- require?'test_helper'?
- ?
- class?UserMailerTest?<?ActionMailer::TestCase?
- ?
- ??include?FactoryGirl::Syntax::Methods?
- ?
- ??def?test_registration_confirmation?
- ?
- ????user?=?FactoryGirl.create(:user_valid)?
- ????mail?=?UserMailer.registration_confirmation(user).deliver?
- ?
- ????assert?!ActionMailer::Base.deliveries.empty??
- ?
- ????assert_equal?[user.email],?mail.to?
- ?????
- ??end?
- end?
上面的測(cè)試中,首先測(cè)試郵件隊(duì)列是否不為空,然后測(cè)試郵件的目標(biāo)地址是否正確。
?
?
本文轉(zhuǎn)自 virusswb 51CTO博客,原文鏈接:http://blog.51cto.com/virusswb/1080256,如需轉(zhuǎn)載請(qǐng)自行聯(lián)系原作者
總結(jié)
以上是生活随笔為你收集整理的Rails测试《十一》添加邮件发送程序及测试邮件发送程序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: php开启curl扩展
- 下一篇: 解决win10 .net framewo