我有金字塔/檐口资源,在网址末尾需要一个?query =关键字。但我不知道如何在金字塔的dummyRequest对象中添加它。代码在浏览器上完美运行,在使用此网址获取内容时,我会得到正确答案:*url*/foo?query=keyword
。
我的类/资源定义如下:
@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')
答案 0 :(得分:3)
除了@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
)的简单情况。
如果您需要测试那些更复杂的查询,可以使用WebOb MultiDict
替换DummyRequest的GET属性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')
,它应返回['foo', 'bar', 'baz']
。
在更简单的情况下,您可以使用request.GET['query']
或request.GET.get('query', 'default')
。我的意思是,你使用request.GET.items()
有点不寻常......
答案 1 :(得分:1)
根据docs,我认为您需要将其作为params
参数传递(未经测试):
request = testing.DummyRequest(params={'query': 'keyword'})