Action Controller 测试用例
用于 ActionController
功能测试的超类。功能测试允许您在每个测试方法中测试单个控制器操作。
与功能风格的控制器测试相比,请使用集成风格的控制器测试。
Rails
不鼓励使用功能测试,而推荐使用集成测试(使用 ActionDispatch::IntegrationTest
)。
新的 Rails
应用程序不再生成功能风格的控制器测试,它们只应用于向后兼容。集成风格的控制器测试执行实际请求,而功能风格的控制器测试只是模拟请求。此外,集成测试与功能测试一样快,并提供许多辅助方法,例如 as
、parsed_body
,以便有效地测试控制器操作,甚至包括 API
端点。
基本示例
功能测试的编写方式如下:1. 首先,使用 get
、post
、patch
、put
、delete
或 head
方法模拟 HTTP 请求。2. 然后,断言当前状态是否符合预期。“状态”可以是任何东西:控制器的 HTTP 响应、数据库内容等等。
例如
class BooksControllerTest < ActionController::TestCase
def test_create
# Simulate a POST response with the given HTTP parameters.
post(:create, params: { book: { title: "Love Hina" }})
# Asserts that the controller tried to redirect us to
# the created book's URI.
assert_response :found
# Asserts that the controller really put the book in the database.
assert_not_nil Book.find_by(title: "Love Hina")
end
end
您也可以在模拟的 HTTP 请求中发送真实文档。
def test_create
json = {book: { title: "Love Hina" }}.to_json
post :create, body: json
end
特殊实例变量
ActionController::TestCase
还将自动提供以下实例变量供测试使用
- @controller
-
将要测试的控制器实例。
- @request
-
一个 ActionController::TestRequest,表示当前的 HTTP 请求。您可以在发送 HTTP 请求之前修改此对象。例如,您可能希望在发送 GET 请求之前设置一些会话属性。
- @response
-
一个
ActionDispatch::TestResponse
对象,表示最后一个 HTTP 响应的响应。在上面的示例中,@response
在调用post
后变得有效。如果各种断言方法不足够,那么您可以使用此对象详细检查 HTTP 响应。
控制器自动推断
ActionController::TestCase
将自动从测试类名推断出要测试的控制器。如果无法从测试类名推断出控制器,则可以使用 tests
显式设置它。
class SpecialEdgeCaseWidgetsControllerTest < ActionController::TestCase
tests WidgetController
end
测试
控制器内部
除了这些特定断言之外,您还可以轻松访问各种集合,可以使用常规测试/单元断言来验证这些集合。这些集合是
-
session: 存储在会话中的对象。
-
flash: 当前在会话中的闪存对象。
-
cookies: 此请求发送给用户的
Cookies
。
这些集合可以使用方式与任何其他哈希相同
assert_equal "Dave", cookies[:name] # makes sure that a cookie called :name was set as "Dave"
assert flash.empty? # makes sure that there's nothing in the flash
除了集合之外,您还可以访问给定操作重定向到的完整 URL,该 URL 在 redirect_to_url
中可用。
对于在同一控制器内重定向,您甚至可以调用 follow_redirect,重定向将被跟踪,触发另一个操作调用,然后可以针对该调用进行断言。
操作会话和 cookie 变量
有时您需要为测试设置会话和 cookie 变量。要执行此操作,只需将值分配给会话或 cookie 集合
session[:key] = "value"
cookies[:key] = "value"
要清除测试的 cookie,只需清除 cookie 集合
cookies.clear
测试
命名路由
如果您使用的是命名路由,则可以使用原始命名路由的方法直接在测试用例中轻松测试它们。
assert_redirected_to page_url(title: 'foo')
属性
[RW] | executor_around_each_request |