Rails測試《十》不能錯過的雜七雜八

weixin_33766168發表於2017-11-26

今天來介紹一些雜七雜八的測試知識,但是它們是不能錯過的。

 

首先來介紹一下常用的測試命令

rake test

執行包括單元測試、功能測試和整合測試在內的所有測試。

 

rake test:units

執行所有的單元測試。

 

rake test:functionals

執行所有的功能測試

 

rake test:integration

執行所有的整合測試。

 

rake test:recent

執行最近修改過的測試。


rake test:uncommited

執行所有未提交的測試。支援svn和git。

 

setup和teardown

在一個包含多個測試方法的測試類中,我們可能會包含一些在每個測試執行之前和之後都需要做的工作,都需要執行的一些程式碼。

比如說建立物件,清理物件之類的。集中在一起便於維護,便於修改,便於閱讀。

這樣的事情我們可以交給setup和teardown來做。setup就是中的程式碼在每個測試方法執行之前執行,teardown中的程式碼會在每個測試方法執行之後執行。

這裡我們拿之前做過的一個針對Admin::TagsController的功能測試舉例,引入setup和teardown。新增tag是需要登入的,會用到使用者資訊,需要session中有值,這部分在Admin::TagsController的所有action中都是需要的,而且使用相同就可以了,把這部分放在setup和teardown正合適。


  1. require 'test_helper' 
  2.  
  3. class Admin::TagsControllerTest < ActionController::TestCase 
  4.   include FactoryGirl::Syntax::Methods 
  5.  
  6.   def setup 
  7.     @user_valid = create(:user_valid
  8.     @request.session[:user_id] = @user_valid.id 
  9.   end 
  10.  
  11.   def teardown 
  12.     @user_valid = nil 
  13.  
  14.   end 
  15.  
  16.   def test_should_create_tag_successfully 
  17.    
  18.  
  19.     tag = build(:tag_valid
  20.  
  21.     assert_difference "Tag.count" do  
  22.       post :create, {:tag => { :title => tag.title}} 
  23.     end 
  24.   end 
  25.  
  26.   def test_should_create_tag_fail 
  27.     
  28.  
  29.     assert_no_difference "Tag.count" do  
  30.       post :create, {:tag => { :title => ""}} 
  31.     end 
  32.   end 
  33. end 

而且rails還把setup和teardown實現為callback,這樣你就可以通過下面的方式來指定setup和teardown。

  • a block
  • a method
  • a method name as a symbol
  • a lambda

  1. setup :init 
  2.  
  3.  teardown do 
  4.    @user_valid = nil 
  5.  
  6.  end 
  7.  private  
  8.  def init 
  9.    @user_valid = create(:user_valid
  10.    @request.session[:user_id] = @user_valid.id 
  11.  end 

 

測試routes

 


  1. assert_routing( 
  2.                 "signout"
  3.                 {:controller =>"sessions":action =>"destroy":method => :delete
  4.                 ) 

 


  1. def test_route_posts_id 
  2.  
  3.   category = FactoryGirl.create(:category_valid) 
  4.  
  5.   article = FactoryGirl.create(:post_valid) 
  6.    
  7.   assert_routing("posts/#{article.id}", {:controller =>  "posts", :action => "show", :id => article.id.to_s }) 
  8.  
  9.  
  10. end 

 




本文轉自 virusswb 51CTO部落格,原文連結:http://blog.51cto.com/virusswb/1079484,如需轉載請自行聯絡原作者

相關文章