使用 URL 中的查询字符串对 Pyramid/Cornice 资源进行单元测试
Unittesting Pyramid/Cornice resource with query string in a URL
我有 Pyramid/cornice 资源,需要在 url 末尾有一个 ?query=关键字。但我不知道如何将其添加到金字塔的 dummyRequest 对象中。代码在浏览器上运行完美,使用 url 获取内容时我会得到正确的响应:*url*/foo?query=keyword
.
我的class/resource是这样定义的:
@resource(path='/bar/search/foo')
class SearchFooResource(object):
def __init__(self, request):
self.request = request
@view(renderer='json')
def get(self):
#get query string, it's a tuple
req = self.request.GET.items()
#do stuff with req
现在 req 应该将所有查询字符串 'stuffs' 包含在一个列表中,该列表将它们作为元组包含,例如:[('query', 'bar'),('query', 'asd')]
。但是如何对该资源进行单元测试?我似乎无法向 self.request.GET.items()
方法添加任何内容。当 运行 unittest req
为空时,我会得到这个错误:AttributeError: 'list' object has no attribute 'items'
.
我当前的单元测试:
def test_passing_GetFooBaarResource(self):
request = testing.DummyRequest()
request.GET = [('query', 'keyword')]
info = SearchFooResource.get(SearchFooResource(request))
self.assertEqual(info['foo'], 'baar')
根据 docs,我认为您需要将其作为 params
参数传递(未测试):
request = testing.DummyRequest(params={'query': 'keyword'})
除了@matino 的建议之外,您还可以只使用普通字典(而不是您尝试过的元组列表)。
def test_passing_GetFooBaarResource(self):
request = testing.DummyRequest()
request.GET = {'query': 'keyword'}
info = SearchShowResource.get(SearchShowResource(request))
self.assertEqual(info['foo'], 'baar')
这适用于没有多个同名参数 (/someurl?name=foo&name=baz&name=bar
) 的简单情况。
如果您需要测试那些更复杂的查询,您可以将 DummyRequest 的 GET 属性替换为 WebOb MultiDict
from webob.multidict import MultiDict
def test_passing_GetFooBaarResource(self):
request = testing.DummyRequest()
request.GET = MultiDict([('query', 'foo'), ('query', 'bar'), ('query', 'baz')])
info = SearchShowResource.get(SearchShowResource(request))
self.assertEqual(info['foo'], 'baar')
然后,通常,在您的实际视图方法中,如果您需要处理具有相同名称的多个参数,您使用 request.GET.getall('query')
,应该 return ['foo', 'bar', 'baz']
。
在更简单的情况下,您可以只使用 request.GET['query']
或 request.GET.get('query', 'default')
。我的意思是,您对 request.GET.items()
的使用有点不寻常...
我有 Pyramid/cornice 资源,需要在 url 末尾有一个 ?query=关键字。但我不知道如何将其添加到金字塔的 dummyRequest 对象中。代码在浏览器上运行完美,使用 url 获取内容时我会得到正确的响应:*url*/foo?query=keyword
.
我的class/resource是这样定义的:
@resource(path='/bar/search/foo')
class SearchFooResource(object):
def __init__(self, request):
self.request = request
@view(renderer='json')
def get(self):
#get query string, it's a tuple
req = self.request.GET.items()
#do stuff with req
现在 req 应该将所有查询字符串 'stuffs' 包含在一个列表中,该列表将它们作为元组包含,例如:[('query', 'bar'),('query', 'asd')]
。但是如何对该资源进行单元测试?我似乎无法向 self.request.GET.items()
方法添加任何内容。当 运行 unittest req
为空时,我会得到这个错误:AttributeError: 'list' object has no attribute 'items'
.
我当前的单元测试:
def test_passing_GetFooBaarResource(self):
request = testing.DummyRequest()
request.GET = [('query', 'keyword')]
info = SearchFooResource.get(SearchFooResource(request))
self.assertEqual(info['foo'], 'baar')
根据 docs,我认为您需要将其作为 params
参数传递(未测试):
request = testing.DummyRequest(params={'query': 'keyword'})
除了@matino 的建议之外,您还可以只使用普通字典(而不是您尝试过的元组列表)。
def test_passing_GetFooBaarResource(self):
request = testing.DummyRequest()
request.GET = {'query': 'keyword'}
info = SearchShowResource.get(SearchShowResource(request))
self.assertEqual(info['foo'], 'baar')
这适用于没有多个同名参数 (/someurl?name=foo&name=baz&name=bar
) 的简单情况。
如果您需要测试那些更复杂的查询,您可以将 DummyRequest 的 GET 属性替换为 WebOb MultiDict
from webob.multidict import MultiDict
def test_passing_GetFooBaarResource(self):
request = testing.DummyRequest()
request.GET = MultiDict([('query', 'foo'), ('query', 'bar'), ('query', 'baz')])
info = SearchShowResource.get(SearchShowResource(request))
self.assertEqual(info['foo'], 'baar')
然后,通常,在您的实际视图方法中,如果您需要处理具有相同名称的多个参数,您使用 request.GET.getall('query')
,应该 return ['foo', 'bar', 'baz']
。
在更简单的情况下,您可以只使用 request.GET['query']
或 request.GET.get('query', 'default')
。我的意思是,您对 request.GET.items()
的使用有点不寻常...