在单元测试期间,我想将生成的URL与测试中定义的静态URL进行比较。对于这种比较,最好有一个TestCase.assertURLEqual或类似的,它可以让你比较字符串格式的两个URL,如果所有查询和片段组件都存在且相等但不一定按顺序,则结果为True。
在我自己实现之前,这个功能已经存在吗?
答案 0 :(得分:1)
在标准库中使用urlparse实现这一点并不难:
from urlparse import urlparse, parse_qs
def urlEq(url1, url2):
pr1 = urlparse(url1)
pr2 = urlparse(url2)
return (pr1.scheme == pr2.scheme and
pr1.netloc == pr2.netloc and
pr1.path == pr2.path and
parse_qs(pr1.query) == parse_qs(pr2.query))
# Prints True
print urlEq("http://foo.com/blah?bar=1&foo=2", "http://foo.com/blah?foo=2&bar=1")
# Prints False
print urlEq("http://foo.com/blah?bar=1&foo=2", "http://foo.com/blah?foo=4&bar=1")
基本上,比较从URL解析的所有内容,但使用parse_qs从查询字符串中获取字典。
答案 1 :(得分:1)
我不知道是否有内置内容,但你可以简单地使用urlparse
并检查自己的查询参数,因为默认情况下会考虑订单。
>>> import urlparse
>>> url1 = 'http://google.com/?a=1&b=2'
>>> url2 = 'http://google.com/?b=2&a=1'
>>> # parse url ignoring query params order
... def parse_url(url):
... u = urlparse.urlparse(url)
... q = u.query
... u = urlparse.urlparse(u.geturl().replace(q, ''))
... return (u, urlparse.parse_qs(q))
...
>>> parse_url(url1)
(ParseResult(scheme='http', netloc='google.com', path='/', params='', query='', fragment=''), {'a': ['1'], 'b': ['2']})
>>> def assert_url_equals(url1, url2):
... return parse_url(url1) == parse_url(url1)
...
>>> assert_url_equals(url1, url2)
True