提交 908bc797 编写于 作者: A Aaron Patterson

use a lookup table for `assert_response`

We shouldn't depend on specific methods imlemented in the TestResponse
subclass because the response could actually be a real response object.

In the future, we should either push the aliased predicate methods in
TestResponse up to the real response object, or remove them
上级 d9fe10cb
...@@ -3,6 +3,13 @@ module ActionDispatch ...@@ -3,6 +3,13 @@ module ActionDispatch
module Assertions module Assertions
# A small suite of assertions that test responses from \Rails applications. # A small suite of assertions that test responses from \Rails applications.
module ResponseAssertions module ResponseAssertions
RESPONSE_PREDICATES = { # :nodoc:
success: :successful?,
missing: :not_found?,
redirect: :redirection?,
error: :server_error?,
}
# Asserts that the response is one of the following types: # Asserts that the response is one of the following types:
# #
# * <tt>:success</tt> - Status code was in the 200-299 range # * <tt>:success</tt> - Status code was in the 200-299 range
...@@ -20,11 +27,9 @@ module ResponseAssertions ...@@ -20,11 +27,9 @@ module ResponseAssertions
# # assert that the response code was status code 401 (unauthorized) # # assert that the response code was status code 401 (unauthorized)
# assert_response 401 # assert_response 401
def assert_response(type, message = nil) def assert_response(type, message = nil)
message ||= "Expected response to be a <#{type}>, but was <#{@response.response_code}>"
if Symbol === type if Symbol === type
if [:success, :missing, :redirect, :error].include?(type) if [:success, :missing, :redirect, :error].include?(type)
assert @response.send("#{type}?"), message assert_predicate @response, RESPONSE_PREDICATES[type], message
else else
code = Rack::Utils::SYMBOL_TO_STATUS_CODE[type] code = Rack::Utils::SYMBOL_TO_STATUS_CODE[type]
if code.nil? if code.nil?
......
...@@ -7,7 +7,7 @@ class ResponseAssertionsTest < ActiveSupport::TestCase ...@@ -7,7 +7,7 @@ class ResponseAssertionsTest < ActiveSupport::TestCase
include ResponseAssertions include ResponseAssertions
FakeResponse = Struct.new(:response_code) do FakeResponse = Struct.new(:response_code) do
[:success, :missing, :redirect, :error].each do |sym| [:successful, :not_found, :redirection, :server_error].each do |sym|
define_method("#{sym}?") do define_method("#{sym}?") do
sym == response_code sym == response_code
end end
...@@ -16,7 +16,7 @@ class ResponseAssertionsTest < ActiveSupport::TestCase ...@@ -16,7 +16,7 @@ class ResponseAssertionsTest < ActiveSupport::TestCase
def test_assert_response_predicate_methods def test_assert_response_predicate_methods
[:success, :missing, :redirect, :error].each do |sym| [:success, :missing, :redirect, :error].each do |sym|
@response = FakeResponse.new sym @response = FakeResponse.new RESPONSE_PREDICATES[sym].to_s.sub(/\?/, '').to_sym
assert_response sym assert_response sym
assert_raises(Minitest::Assertion) { assert_raises(Minitest::Assertion) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册