提交 12f49762 编写于 作者: R Rafael França

Merge pull request #22935 from cllns/add-status-name-to-output

Add HTTP status name to output of tests
* Provide the name of HTTP Status code in assertions.
*Sean Collins*
* More explicit error message when running `rake routes`. `CONTROLLER` argument
can now be supplied in different ways:
`Rails::WelcomeController`, `Rails::Welcome`, `rails/welcome`
......
......@@ -95,6 +95,7 @@ module Session
autoload :TestProcess
autoload :TestRequest
autoload :TestResponse
autoload :AssertionResponse
end
end
......
module ActionDispatch
# This is a class that abstracts away an asserted response.
# It purposely does not inherit from Response, because it doesn't need it.
# That means it does not have headers or a body.
#
# As an input to the initializer, we take a Fixnum, a String, or a Symbol.
# If it's a Fixnum or String, we figure out what its symbolized name.
# If it's a Symbol, we figure out what its corresponding code is.
# The resulting code will be a Fixnum, for real HTTP codes, and it will
# be a String for the pseudo-HTTP codes, such as:
# :success, :missing, :redirect and :error
class AssertionResponse
attr_reader :code, :name
GENERIC_RESPONSE_CODES = { # :nodoc:
success: "2XX",
missing: "404",
redirect: "3XX",
error: "5XX"
}
def initialize(code_or_name)
if code_or_name.is_a?(Symbol)
@name = code_or_name
@code = code_from_name(code_or_name)
else
@name = name_from_code(code_or_name)
@code = code_or_name
end
raise ArgumentError, "Invalid response name: #{name}" if @code.nil?
raise ArgumentError, "Invalid response code: #{code}" if @name.nil?
end
def code_and_name
"#{code}: #{name}"
end
private
def code_from_name(name)
GENERIC_RESPONSE_CODES[name] || Rack::Utils::SYMBOL_TO_STATUS_CODE[name]
end
def name_from_code(code)
GENERIC_RESPONSE_CODES.invert[code] || Rack::Utils::HTTP_STATUS_CODES[code]
end
end
end
module ActionDispatch
module Assertions
# A small suite of assertions that test responses from \Rails applications.
......@@ -29,18 +28,10 @@ module ResponseAssertions
def assert_response(type, message = nil)
message ||= generate_response_message(type)
if Symbol === type
if [:success, :missing, :redirect, :error].include?(type)
assert @response.send(RESPONSE_PREDICATES[type]), message
else
code = Rack::Utils::SYMBOL_TO_STATUS_CODE[type]
if code.nil?
raise ArgumentError, "Invalid response type :#{type}"
end
assert_equal code, @response.response_code, message
end
if RESPONSE_PREDICATES.keys.include?(type)
assert @response.send(RESPONSE_PREDICATES[type]), message
else
assert_equal type, @response.response_code, message
assert_equal AssertionResponse.new(type).code, @response.response_code, message
end
end
......@@ -85,8 +76,9 @@ def normalize_argument_to_redirection(fragment)
end
end
def generate_response_message(type, code = @response.response_code)
"Expected response to be a <#{type}>, but was a <#{code}>"
def generate_response_message(expected, actual = @response.response_code)
"Expected response to be a <#{code_with_name(expected)}>,"\
" but was a <#{code_with_name(actual)}>"
.concat location_if_redirected
end
......@@ -95,6 +87,14 @@ def location_if_redirected
location = normalize_argument_to_redirection(@response.location)
" redirect to <#{location}>"
end
def code_with_name(code_or_name)
if RESPONSE_PREDICATES.values.include?("#{code_or_name}?".to_sym)
code_or_name = RESPONSE_PREDICATES.invert["#{code_or_name}?".to_sym]
end
AssertionResponse.new(code_or_name).code_and_name
end
end
end
end
......@@ -74,7 +74,18 @@ def test_error_message_shows_404_when_404_asserted_for_success
@response.status = 404
error = assert_raises(Minitest::Assertion) { assert_response :success }
expected = "Expected response to be a <success>, but was a <404>"
expected = "Expected response to be a <2XX: success>,"\
" but was a <404: Not Found>"
assert_match expected, error.message
end
def test_error_message_shows_404_when_asserted_for_200
@response = ActionDispatch::Response.new
@response.status = 404
error = assert_raises(Minitest::Assertion) { assert_response 200 }
expected = "Expected response to be a <200: OK>,"\
" but was a <404: Not Found>"
assert_match expected, error.message
end
......@@ -84,7 +95,8 @@ def test_error_message_shows_302_redirect_when_302_asserted_for_success
@response.location = 'http://test.host/posts/redirect/1'
error = assert_raises(Minitest::Assertion) { assert_response :success }
expected = "Expected response to be a <success>, but was a <302>" \
expected = "Expected response to be a <2XX: success>,"\
" but was a <302: Found>" \
" redirect to <http://test.host/posts/redirect/1>"
assert_match expected, error.message
end
......@@ -95,7 +107,8 @@ def test_error_message_shows_302_redirect_when_302_asserted_for_301
@response.location = 'http://test.host/posts/redirect/2'
error = assert_raises(Minitest::Assertion) { assert_response 301 }
expected = "Expected response to be a <301>, but was a <302>" \
expected = "Expected response to be a <301: Moved Permanently>,"\
" but was a <302: Found>" \
" redirect to <http://test.host/posts/redirect/2>"
assert_match expected, error.message
end
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册