每天一剂Rails良药之Testing Across Multiple Controllers

本文介绍Rails中的集成测试方法,通过具体示例展示了如何编写跨越多个controllers的集成测试,并提出了一种利用DSL模块来提高测试效率的方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Rails测试分三种:
1,关注于一个单独的Model的单元测试Unit test
2,关注于一个单独的Controller和它使用的models之间的交互的功能测试Functional test
3,关注story级的多个controllers的多个actions之间的交互的集成测试Integration test
今天我们就来看看跨越多个controllers的集成测试
IntegrationTesting/test/integration/stories_test.rb
[code]
require "#{File.dirname(__FILE__)}/../test_helper"

class StoriesTest < ActionController::IntegrationTest
fixtures :accounts, :ledgers, :registers, :people

def test_signup_new_person
go_to_login
go_to_signup
signup :name => "Bob",
:user_name => "bob",
:password => "secret"
end

private
def go_to_login
get "/login"
assert_response :success
assert_template "login/index"
end

def go_to_signup
get "/signup"
assert_response :success
assert_template "signup/index"
end

def signup(options)
post "/signup", options
assert_response :redirect
follow_redirect!
assert_response :success
assert_template "ledger/index"
end
end
[/code]
其中我们将一些通用的流程做成helper方法,如go_to_login,go_to_signup,signup
我们甚至可以将登录认证等通用流程做成一个helper方法并放在我们自己的DSL模块里:
[code]
require "#{File.dirname(__FILE__)}/../test_helper"

class StoriesTest < ActionController::IntegrationTest
fixtures :accounts, :ledgers, :registers, :people

def test_multiple_users
jim = new_session_as(:jim)
bob = new_session_as(:bob)
stacey = new_session_as(:stacey)

jim.selects_ledger(:jims)
jim.adds_account(:name => "checking:)
bob.goes_to_preferences
stacey.cancels_account
end

private

module MyTestingDSL
attr_reader :person

def logs_in_as(person)
@person = people(person)
post authenticate_url, :user_name => @person.user_name, :password => @person.password
is_redirected_to "ledger/list"
end

def goes_to_preferences
# ...
end

def cancels_account
# ...
end

def new_session_as(person)
new_session do |sess|
sess.goes_to_login
sess.logs_in_as(person)
yield sess if block_given?
end
end
end
[/code]
我们会发现集成测试比单独Controller的功能测试慢许多,因为集成测试涉及的东西太多
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值