单元测试Pyramid / Cornice资源以及URL中的查询字符串

时间:2015-03-21 18:41:40

标签: python python-requests pyramid python-unittest cornice

我有金字塔/檐口资源,在网址末尾需要一个?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')

2 个答案:

答案 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'})