跳至内容 跳至搜索

Action Controller 测试用例

用于 ActionController 功能测试的超类。功能测试允许您在每个测试方法中测试单个控制器操作。

与功能风格的控制器测试相比,请使用集成风格的控制器测试。

Rails 不鼓励使用功能测试,而推荐使用集成测试(使用 ActionDispatch::IntegrationTest)。

新的 Rails 应用程序不再生成功能风格的控制器测试,它们只应用于向后兼容。集成风格的控制器测试执行实际请求,而功能风格的控制器测试只是模拟请求。此外,集成测试与功能测试一样快,并提供许多辅助方法,例如 asparsed_body,以便有效地测试控制器操作,甚至包括 API 端点。

基本示例

功能测试的编写方式如下:1. 首先,使用 getpostpatchputdeletehead 方法模拟 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