Module | ActionController::Assertions::ResponseAssertions |
In: |
vendor/rails/actionpack/lib/action_controller/assertions/response_assertions.rb
|
A small suite of assertions that test responses from Rails applications.
Assert that the redirection options passed in match those of the redirect called in the latest action. This match can be partial, such that assert_redirected_to(:controller => "weblog") will also match the redirection of redirect_to(:controller => "weblog", :action => "show") and so on.
# assert that the redirection was to the "index" action on the WeblogController assert_redirected_to :controller => "weblog", :action => "index" # assert that the redirection was to the named route login_url assert_redirected_to login_url
# File vendor/rails/actionpack/lib/action_controller/assertions/response_assertions.rb, line 53 53: def assert_redirected_to(options = {}, message=nil) 54: clean_backtrace do 55: assert_response(:redirect, message) 56: return true if options == @response.redirected_to 57: ActionController::Routing::Routes.reload if ActionController::Routing::Routes.empty? 58: 59: begin 60: url = {} 61: original = { :expected => options, :actual => @response.redirected_to.is_a?(Symbol) ? @response.redirected_to : @response.redirected_to.dup } 62: original.each do |key, value| 63: if value.is_a?(Symbol) 64: value = @controller.respond_to?(value, true) ? @controller.send(value) : @controller.send("hash_for_#{value}_url") 65: end 66: 67: unless value.is_a?(Hash) 68: request = case value 69: when NilClass then nil 70: when /^\w+:\/\// then recognized_request_for(%r{^(\w+://.*?(/|$|\?))(.*)$} =~ value ? $3 : nil) 71: else recognized_request_for(value) 72: end 73: value = request.path_parameters if request 74: end 75: 76: if value.is_a?(Hash) # stringify 2 levels of hash keys 77: if name = value.delete(:use_route) 78: route = ActionController::Routing::Routes.named_routes[name] 79: value.update(route.parameter_shell) 80: end 81: 82: value.stringify_keys! 83: value.values.select { |v| v.is_a?(Hash) }.collect { |v| v.stringify_keys! } 84: if key == :expected && value['controller'] == @controller.controller_name && original[:actual].is_a?(Hash) 85: original[:actual].stringify_keys! 86: value.delete('controller') if original[:actual]['controller'].nil? || original[:actual]['controller'] == value['controller'] 87: end 88: end 89: 90: if value.respond_to?(:[]) && value['controller'] 91: value['controller'] = value['controller'].to_s 92: if key == :actual && value['controller'].first != '/' && !value['controller'].include?('/') 93: new_controller_path = ActionController::Routing.controller_relative_to(value['controller'], @controller.class.controller_path) 94: value['controller'] = new_controller_path if value['controller'] != new_controller_path && ActionController::Routing.possible_controllers.include?(new_controller_path) 95: end 96: value['controller'] = value['controller'][1..-1] if value['controller'].first == '/' # strip leading hash 97: end 98: url[key] = value 99: end 100: 101: @response_diff = url[:actual].diff(url[:expected]) if url[:actual] 102: msg = build_message(message, "expected a redirect to <?>, found one to <?>, a difference of <?> ", url[:expected], url[:actual], @response_diff) 103: 104: assert_block(msg) do 105: url[:expected].keys.all? do |k| 106: if k == :controller then url[:expected][k] == ActionController::Routing.controller_relative_to(url[:actual][k], @controller.class.controller_path) 107: else parameterize(url[:expected][k]) == parameterize(url[:actual][k]) 108: end 109: end 110: end 111: rescue ActionController::RoutingError # routing failed us, so match the strings only. 112: msg = build_message(message, "expected a redirect to <?>, found one to <?>", options, @response.redirect_url) 113: url_regexp = %r{^(\w+://.*?(/|$|\?))(.*)$} 114: eurl, epath, url, path = [options, @response.redirect_url].collect do |url| 115: u, p = (url_regexp =~ url) ? [$1, $3] : [nil, url] 116: [u, (p.first == '/') ? p : '/' + p] 117: end.flatten 118: 119: assert_equal(eurl, url, msg) if eurl && url 120: assert_equal(epath, path, msg) if epath && path 121: end 122: end 123: end
Asserts that the response is one of the following types:
You can also pass an explicit status number like assert_response(501) or its symbolic equivalent assert_response(:not_implemented). See ActionController::StatusCodes for a full list.
# assert that the response was a redirection assert_response :redirect # assert that the response code was status code 401 (unauthorized) assert_response 401
# File vendor/rails/actionpack/lib/action_controller/assertions/response_assertions.rb, line 27 27: def assert_response(type, message = nil) 28: clean_backtrace do 29: if [ :success, :missing, :redirect, :error ].include?(type) && @response.send("#{type}?") 30: assert_block("") { true } # to count the assertion 31: elsif type.is_a?(Fixnum) && @response.response_code == type 32: assert_block("") { true } # to count the assertion 33: elsif type.is_a?(Symbol) && @response.response_code == ActionController::StatusCodes::SYMBOL_TO_STATUS_CODE[type] 34: assert_block("") { true } # to count the assertion 35: else 36: assert_block(build_message(message, "Expected response to be a <?>, but was <?>", type, @response.response_code)) { false } 37: end 38: end 39: end
Asserts that the request was rendered with the appropriate template file.
# assert that the "new" view template was rendered assert_template "new"
# File vendor/rails/actionpack/lib/action_controller/assertions/response_assertions.rb, line 132 132: def assert_template(expected = nil, message=nil) 133: clean_backtrace do 134: rendered = expected ? @response.rendered_file(!expected.include?('/')) : @response.rendered_file 135: msg = build_message(message, "expecting <?> but rendering with <?>", expected, rendered) 136: assert_block(msg) do 137: if expected.nil? 138: !@response.rendered_with_file? 139: else 140: expected == rendered 141: end 142: end 143: end 144: end