当前位置:首页 > 网站旧栏目 > 学习园地 > 设计软件教程 > 每天一剂Rails良药之Testing Across Multiple Controllers

每天一剂Rails良药之Testing Across Multiple Controllers
2010-01-14 07:09:34  作者:  来源:
Rails测试分三种:
1,关注于一个单独的Model的单元测试Unit test
2,关注于一个单独的Controller和它使用的models之间的交互的功能测试Functional test
3,关注story级的多个controllers的多个actions之间的交互的集成测试Integration test
今天我们就来看看跨越多个controllers的集成测试
IntegrationTesting/test/integration/stories_test.rb
Java代码 复制代码
  1. require "#{File.dirname(__FILE__)}/../test_helper"  
  2.   
  3. class StoriesTest < ActionController::IntegrationTest   
  4.   fixtures :accounts, :ledgers, :registers, :people   
  5.   
  6.   def test_signup_new_person   
  7.     go_to_login   
  8.     go_to_signup   
  9.     signup :name => "Bob",   
  10.            :user_name => "bob",   
  11.            :password => "secret"  
  12.   end   
  13.   
  14.   private  
  15.   def go_to_login   
  16.     get "/login"  
  17.     assert_response :success   
  18.     assert_template "login/index"  
  19.   end   
  20.   
  21.   def go_to_signup   
  22.     get "/signup"  
  23.     assert_response :success   
  24.     assert_template "signup/index"  
  25.   end   
  26.   
  27.   def signup(options)   
  28.     post "/signup", options   
  29.     assert_response :redirect   
  30.     follow_redirect!   
  31.     assert_response :success   
  32.     assert_template "ledger/index"  
  33.   end   
  34. end  

其中我们将一些通用的流程做成helper方法,如go_to_login,go_to_signup,signup
我们甚至可以将登录认证等通用流程做成一个helper方法并放在我们自己的DSL模块里:
Java代码 复制代码
  1. require "#{File.dirname(__FILE__)}/../test_helper"  
  2.   
  3. class StoriesTest < ActionController::IntegrationTest   
  4.   fixtures :accounts, :ledgers, :registers, :people   
  5.   
  6.   def test_multiple_users   
  7.     jim = new_session_as(:jim)   
  8.     bob = new_session_as(:bob)   
  9.     stacey = new_session_as(:stacey)   
  10.   
  11.     jim.selects_ledger(:jims)   
  12.     jim.adds_account(:name => "checking:)   
  13.     bob.goes_to_preferences   
  14.     stacey.cancels_account   
  15.   end   
  16.   
  17.   private  
  18.   
  19.   module MyTestingDSL   
  20.     attr_reader :person   
  21.   
  22.     def logs_in_as(person)   
  23.       @person = people(person)   
  24.       post authenticate_url, :user_name => @person.user_name, :password => @person.password   
  25.       is_redirected_to "ledger/list"  
  26.     end   
  27.   
  28.     def goes_to_preferences   
  29.       # ...   
  30.     end   
  31.   
  32.     def cancels_account   
  33.       # ...   
  34.     end   
  35.   
  36.     def new_session_as(person)   
  37.       new_session do |sess|   
  38.         sess.goes_to_login   
  39.         sess.logs_in_as(person)   
  40.         yield sess if block_given?   
  41.       end   
  42.     end   
  43. end  

我们会发现集成测试比单独Controller的功能测试慢许多,因为集成测试涉及的东西太多

安徽新华电脑学校专业职业规划师为你提供更多帮助【在线咨询