溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Rails測試《十一》添加郵件發送程序及測試郵件發送程序

發布時間:2020-06-24 21:05:44 來源:網絡 閱讀:1581 作者:virusswb 欄目:軟件技術

講到測試郵件發送程序,我們首先要讓系統可以發送郵件。我們先來給系統添加發送郵件的功能。

Action Mailer in Rails 3是一個不錯的視頻教程,大家可以參考。

還有就是http://guides.rubyonrails.org/action_mailer_basics.html中更加詳細的介紹。

 

添加郵件發送程序

發送郵件要保證我們有目標郵箱,所以呢,我們的用戶要有一個屬性:email。

還是拿我的blog項目作為練習項目。

我們在用戶注冊的時候給他發一封郵件。

 

首先我們創建一個初始化文件

config/initializers/setup_mail.rb,初始化郵箱相關的信息。

  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的郵箱作為郵件發送服務器,需要我們在上面有一個注冊用戶,這里我注冊一個woaiguanshui201,密碼是123456asdf。

 

創建郵件發送程序

然后用rails g mailer命令創建一個mailer程序。

  1. rails g mailer user_mailer 

命令會創建app/mailers/user_mailer.rb文件。

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

在里面添加一個方法,用來在用戶注冊的時候給用戶發郵件。

  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 

 

創建郵件內容模板

郵件的內容也可以通過模板來實現,和controller的action對應有一個view一樣。我們的mailer的方法也需要一個view來做模板。

創建app/views/user_mailer/registration_confirmation.text.erb文件,在文件中寫入下面的內容。

  1. Thank you for registering! 

 

調用郵件發送程序

上下最后一步了,就是在用戶注冊成功之后,調用這個mailer程序的registration_confirmation方法,就可以發送我們預定義的模板文件中的內容了。

我們把用戶注冊的方法修改一下,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 

上面這一行是我們新加入的,就是發郵件用的。

 

這時候啟動我們的服務rails s,然后注冊一個用戶,然后看看用戶的郵箱,就應該有了一封從woaiguanshui2012@163發來的郵件,標題是Registered,內容是thank you for registering!。

這就說明我們的郵件發送程序正常工作了。

 

豐富郵件內容模板

我們還可以豐富一下郵件的內容,比如添加用戶的信息。修改registration_confirmation.text.erb文件。

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

這就需要我們在registration_comfirmation方法中添加一個返回的變量@user。

  1. def registration_confirmation(user) 
  2.     @user = user 
  3.    mail(:to => user.email, :subject => "Registered"
  4.  end 

在模板中使用url的話,比如說edit_user_url(@user.id, :host => "localhost:3000"),這時候就只能使用_url方法,不能使用_path方法,同時還需要指定host。這是因為郵件客戶端沒有web的上下文環境,不像controller中是有web的上下文環境的,所以不需要指定host。當然,每次指定還是比較麻煩的,你也可以在前面創建的配置文件config/initializers/setup_mail.rb中添加下面的一樣。

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

這樣就可以省略url中的host參數了。

 

在郵件中添加附件

  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 

再次注冊用戶,然后登錄用戶的郵箱,就會發現收到了一封帶有附件的郵件。

關于郵件發送還有很多,大家在使用和設計的過程中會有更多的體會。比如說我們現在的發送郵件和用戶注冊是同步處理的,這樣的話,大量用戶注冊,就會嚴重拖慢系統,甚至拖垮系統。郵件沒有必要和用戶注冊同步處理,可以做成異步的,可以做成獨立的job。這時候郵件發送就需要獨立出來,可以搞成一個郵件隊列,只要在用戶注冊的時候發送一個郵件消息給郵件隊列,由隊列負責具體的發送工作就可以了。

 

測試郵件發送程序

關于郵件測試有下面幾個目的

  • 郵件正在被處理,創建或者發送。
  • 郵件的內容是正確的,包括標題,發送人,body等。
  • 在正確的時間發送了正確的郵件。

 

可以從兩個方向來測試郵件,一個是單元測試,一個是功能測試。在單元測試中,我們在一個隔離的環境中運行郵件程序,內容是受控的,然后和模擬數據比較輸出的內容。在功能測試中,我們在controller和model中正確的使用郵件發送程序,測試在正確的時間發送了正確的郵件。


默認情況下,測試環境是不能發郵件的。他們只會把郵件加入ActionMailer::Base.deliveries數組,通過判斷數組不為空,就可以知道郵件是否發送成功。

測試郵件就是兩件事:

  • 測試郵件是否加入隊列。
  • 測試郵件內容是否正確。

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 

上面的測試中,首先測試郵件隊列是否不為空,然后測試郵件的目標地址是否正確。

 

 

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女