使用 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() 的使用有点不寻常...