您好,登錄后才能下訂單哦!
開場白
今天我們來熟悉一下rails的集成測試integration test。
簡介
集成測試主要是測試多個controller之間的交互,以及測試應用中比較重要的工作流程,驗證這些工作流程是否符合預期的設想。
不像單元測試和功能測試,是自動添加的。集成測試是需要我們手動添加的,rails提供了一個命令
rails generate integration_test
通過命令就可以在test/integration文件夾創建集成測試。
- $ rails generate integration_test user_flows
- exists test/integration/
- create test/integration/user_flows_test.rb
我們先來了解一些集成測試中常用的幫助方法。
- https?
如果session正在模擬https請求,就返回true。
- https!
允許你模擬https請求。
- host!
允許你在下一次的請求中設置host name。
- redirect?
如果上一次請求是一個跳轉,就返回true。
- follow_redirect!
緊跟著一個跳轉的響應
- request_via_redirect(http_method, path, [parameters], [headers])
向指定的path發送http請求,可選parameters,可選headers,然后跟著一個跳轉。
- post_via_redirect(path, [parameters], [headers])
向指定的path發送post請求,可選parameters,可選headers,然后跟著一個跳轉。
- get_via_redirect(path, [parameters], [headers])
向指定的path發送get請求,可選parameters,可選headers,然后跟著一個跳轉。
- put_via_redirect(path, [parameters], [headers])
向指定的path發送put請求,可選parameters,可選headers,然后跟著一個跳轉。
- delete_via_redirect(path, [parameters], [headers])
向指定的path發送delete請求,可選parameters,可選headers,然后跟著一個跳轉。
- open_session
開啟一個新的session
示例
讓我們在創建好的集成測試文件test/integration/user_flows_test.rb中添加一些代碼。
- require 'test_helper'
- class UserFlowsTest < ActionDispatch::IntegrationTest
- include FactoryGirl::Syntax::Methods
- def test_admin_login_and_browse_posts
- user = FactoryGirl.create(:user_valid)
- get "/signin"
- assert_response(200)
- post_via_redirect("sessions", {:user=>{:email=> user.email, :password => user.password}})
- assert_equal "/", path
- assert_equal "sign in successfully", flash[:notice]
- get "admin/posts"
- assert_response(200)
- assert assigns(:posts)
- end
- end
上面的代碼中,我們先是在users表中添加了一條記錄。然后訪問signin,然后斷言是否返回200.
然后向sessions提交剛才添加的用戶郵箱和密碼,sessionscontroller是負責驗證用戶信息的controller。然后斷言是否跳轉到了根目錄,是否出現了正確的flash提示信息。
最后訪問admin/posts,斷言是否返回200,并且返回posts變量。
上面的測試涉及了多個controller,測試覆蓋從數據庫到controller的調度分配。
我們可以同時模擬多個session,并且用extend擴展這些session,創建一些強大的測試用的DSL(Domain-Specific Language 領域描述語言)。
我們把上面的測試改成下面的樣子。
- require 'test_helper'
- class UserFlowsTest < ActionDispatch::IntegrationTest
- include FactoryGirl::Syntax::Methods
- def test_admin_login_and_browse_posts
- user = FactoryGirl.create(:user_valid)
- guest = FactoryGirl.create(:user_valid_too)
- user_session = signin(user)
- guest_session = signin(guest)
- assert_equal("sign in successfully", user_session.flash[:notice])
- assert_equal("sign in successfully", guest_session.flash[:notice])
- user_session.browse_site
- guest_session.browse_site
- end
- private
- module CustomDSL
- def browse_site
- get "admin/posts"
- assert_response(200)
- assert assigns(:posts)
- end
- end
- def signin(user)
- open_session do |sess|
- sess.extend(CustomDSL)
- sess.post_via_redirect("sessions", {:user => {:email => user.email, :password => user.password}})
- end
- end
- end
什么是DSL(領域描述語言)呢?
我理解就是業務描述語言。我們的應用一般是面向一個行業,或者說面向一個領域的,業務的語言就是領域描述語言。
如果能用這個領域的業務語言描述測試過程,那么這個測試就更加貼近業務,具有了很強的溝通能力。也就是說這個測試可以拿來和業務進行溝通,看看是不是他們想要的業務過程。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。