如何在Rails测试中使用参数轻松解析URL?

时间:2009-05-27 14:37:58

标签: ruby-on-rails ruby testing url parsing

我有一些代码将return_to网址嵌入到我要测试的重定向(如OpenID)中:

def test_uses_referrer_for_return_to
  expected_return_to = 'http://test.com/foo'
  @request.env['HTTP_REFERER'] = expected_return_to
  get :fazbot
  # @response.redirected_to looks like http://service.com?...&return_to=[URI-encoded version of URL above]&...
  encoded_return_to = (something_here)[:return_to]
  assert_equal expected_return_to, URI.unencode(encoded_return_to)
end

这是一个Rails ActionController::TestCase,所以我可以访问各种辅助方法;我找不到合适的人。

当然我可以使用URI.parse来获取网址的params部分,然后将其拆分为/&|?/,然后再次在'='上拆分,但我希望这已经是为我做的。另外,如果我错过了网址转义或参数解析中的一些模糊规则,该怎么办? ActionPackActiveSupport执行此操作,但我无法找到它。

谢谢:)

2 个答案:

答案 0 :(得分:41)

CGI::parse(querystring)会将查询字符串解析为哈希值。然后,CGI::unescape(string)将撤消值中的任何网址编码。

或者,您可以使用Rack::Utils.parse_queryRack::Utils.unescape,如果您使用的是最近的基于机架的Rails版本,并且想要超现代。

我不知道任何包含这些实用程序函数的Rails特定辅助方法,但它们使用起来非常简单,而且无论如何已经在Rails环境中加载了CGI或Rack。

答案 1 :(得分:27)

你想要Addressable

uri = Addressable::URI.parse("http://example.com/?var=value")
uri.query_values # => {"var"=>"value"}
uri.query_values = {"one" => "1", "two" => "2"}
uri.to_s # => "http://example.com/?two=2&one=1"

它将自动为您处理所有转义规则,并且它还有一些其他有用的功能,例如不会为完全有效但模糊的URI(如内置URI解析器)抛出异常。