日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Rails测试《十一》添加邮件发送程序及测试邮件发送程序

發(fā)布時(shí)間:2024/4/13 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Rails测试《十一》添加邮件发送程序及测试邮件发送程序 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

講到測(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)的信息。

  • ActionMailer::Base.smtp_settings?=?{?
  • ??:address??????????????=>?"smtp.163.com",?
  • ??:port?????????????????=>?25,?
  • ??:domain???????????????=>?"163.com",?
  • ??:user_name????????????=>?"woaiguanshui2012",?
  • ??:password?????????????=>?"123456asdf",?
  • ??:authentication???????=>?"plain",?
  • ??:enable_starttls_auto?=>?true?
  • }?
  • 我們使用163的郵箱作為郵件發(fā)送服務(wù)器,需要我們?cè)谏厦嬗幸粋€(gè)注冊(cè)用戶,這里我注冊(cè)一個(gè)woaiguanshui201,密碼是123456asdf。

    ?

    創(chuàng)建郵件發(fā)送程序

    然后用rails g mailer命令創(chuàng)建一個(gè)mailer程序。

  • rails?g?mailer?user_mailer?
  • 命令會(huì)創(chuàng)建app/mailers/user_mailer.rb文件。

  • class?UserMailer?<?ActionMailer::Base?
  • ??default?:from?=>?"woaiguanshui2012@163.com"?
  • end?
  • 在里面添加一個(gè)方法,用來(lái)在用戶注冊(cè)的時(shí)候給用戶發(fā)郵件。

  • class?UserMailer?<?ActionMailer::Base?
  • ??default?:from?=>?"woaiguanshui2012@163.com"?
  • ??def?registration_confirmation(user)?
  • ????mail(:to?=>?user.email,?:subject?=>?"Registered")?
  • ??end?
  • end?
  • ?

    創(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)容。

  • Thank?you?for?registering!?
  • ?

    調(diào)用郵件發(fā)送程序

    上下最后一步了,就是在用戶注冊(cè)成功之后,調(diào)用這個(gè)mailer程序的registration_confirmation方法,就可以發(fā)送我們預(yù)定義的模板文件中的內(nèi)容了。

    我們把用戶注冊(cè)的方法修改一下,userscontroller的create方法。

  • def?create?
  • ????@user?=?User.new(params[:user])?
  • ?
  • ????if?@user.save?
  • ??????UserMailer.registration_confirmation(@user).deliver?
  • ?
  • ??????flash[:notice]?=?"sign?up?successfully!"?
  • ??????signin(@user)?
  • ??????redirect_to?root_path?
  • ????else?
  • ??????flash.now[:notice]?=?"sign?up?failed!"?
  • ??????render?:new?
  • ????end?
  • ??end?
  • 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文件。

  • Hi,?<%=?@user.nickname?%>?
  • ?
  • Thank?you?for?registering!?
  • ?
  • Welcome?to?come?back!?
  • 這就需要我們?cè)趓egistration_comfirmation方法中添加一個(gè)返回的變量@user。

  • def?registration_confirmation(user)?
  • ????@user?=?user?
  • ???mail(:to?=>?user.email,?:subject?=>?"Registered")?
  • ?end?
  • 在模板中使用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中添加下面的一樣。

  • ActionMailer::Base.default_url_options[:host]?=?"localhost:3000"?
  • 這樣就可以省略u(píng)rl中的host參數(shù)了。

    ?

    在郵件中添加附件

  • def?registration_confirmation(user)?
  • ??@user?=?user?
  • ??attachments["rails.png"]?=?File.read("#{Rails.root}/public/images/rails.png")?
  • ??mail(:to?=>?"#{user.name}?<#{user.email}>",?:subject?=>?"Registered")?
  • end?
  • 再次注冊(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)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。