Railsテスト『十』見逃せない雑多


今日は雑多なテスト知識を紹介しますが、見逃すことはできません.
 
まず、よく使うテストコマンドについてご紹介します
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を導入します.タグを追加するにはログインが必要で、ユーザー情報が使用され、sessionに値が必要です.この部分はAdmin::TagsControllerのすべてのactionで必要で、同じものを使用すればいいので、setupとteardownに置くのが適切です.
   
   
   
   
  1. require 'test_helper' 
  2.  
  3. class Admin::TagsControllerTest 
  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