溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Rails測(cè)試《十一》添加郵件發(fā)送程序及測(cè)試郵件發(fā)送程序

發(fā)布時(shí)間:2020-06-24 21:05:44 來(lái)源:網(wǎng)絡(luò) 閱讀:1545 作者:virusswb 欄目:軟件技術(shù)

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

  1. ActionMailer::Base.smtp_settings = { 
  2.   :address              => "smtp.163.com", 
  3.   :port                 => 25, 
  4.   :domain               => "163.com", 
  5.   :user_name            => "woaiguanshui2012", 
  6.   :password             => "123456asdf", 
  7.   :authentication       => "plain", 
  8.   :enable_starttls_auto => true 

我們使用163的郵箱作為郵件發(fā)送服務(wù)器,需要我們?cè)谏厦嬗幸粋€(gè)注冊(cè)用戶,這里我注冊(cè)一個(gè)woaiguanshui201,密碼是123456asdf。

 

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

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

  1. rails g mailer user_mailer 

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

  1. class UserMailer < ActionMailer::Base 
  2.   default :from => "woaiguanshui2012@163.com" 
  3. end 

在里面添加一個(gè)方法,用來(lái)在用戶注冊(cè)的時(shí)候給用戶發(fā)郵件。

  1. class UserMailer < ActionMailer::Base 
  2.   default :from => "woaiguanshui2012@163.com" 
  3.   def registration_confirmation(user) 
  4.     mail(:to => user.email, :subject => "Registered"
  5.   end 
  6. 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文件,在文件中寫(xiě)入下面的內(nèi)容。

  1. Thank you for registering! 

 

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

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

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

  1. def create 
  2.     @user = User.new(params[:user]) 
  3.  
  4.     if @user.save 
  5.       UserMailer.registration_confirmation(@user).deliver 
  6.  
  7.       flash[:notice] = "sign up successfully!" 
  8.       signin(@user) 
  9.       redirect_to root_path 
  10.     else 
  11.       flash.now[:notice] = "sign up failed!" 
  12.       render :new 
  13.     end 
  14.   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文件。

  1. Hi, <%= @user.nickname %> 
  2.  
  3. Thank you for registering! 
  4.  
  5. Welcome to come back! 

這就需要我們?cè)趓egistration_comfirmation方法中添加一個(gè)返回的變量@user。

  1. def registration_confirmation(user) 
  2.     @user = user 
  3.    mail(:to => user.email, :subject => "Registered"
  4.  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中添加下面的一樣。

  1. ActionMailer::Base.default_url_options[:host] = "localhost:3000" 

這樣就可以省略u(píng)rl中的host參數(shù)了。

 

在郵件中添加附件

  1. def registration_confirmation(user) 
  2.   @user = user 
  3.   p_w_uploads["rails.png"] = File.read("#{Rails.root}/public/p_w_picpaths/rails.png"
  4.   mail(:to => "#{user.name} <#{user.email}>":subject => "Registered"
  5. 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)地址是否正確。

 

 

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI