【问题标题】:Unittesting Pyramid/Cornice resource with query string in a URL在 URL 中使用查询字符串对 Pyramid/Cornice 资源进行单元测试
【发布时间】:2015-03-21 18:41:40
【问题描述】:

我有 Pyramid/cornice 资源,需要在 url 末尾添加一个 ?query=keyword。但我不知道如何在金字塔的 dummyRequest 对象中添加它。代码在浏览器上完美运行,使用此 url 获取内容时我会得到正确的响应:*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')

【问题讨论】:

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


    【解决方案1】:

    除了@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'),它应该返回['foo', 'bar', 'baz']

    在更简单的情况下,您可以只使用request.GET['query']request.GET.get('query', 'default')。我的意思是,你对request.GET.items() 的使用有点不寻常……

    【讨论】:

    • request.GET.getall('query') 问题是当没有查询或只有一个时,它会出错。 .items() 适用于所有情况,但需要进行一些解析。但是,是的,这个答案解决了我如何在请求中添加两次“查询”的问题。
    • @MiroK.:实际上,查看源代码,如果没有值或只有一个值,.getall('query') 似乎永远不会失败。在这些情况下,它会返回一个空列表或只有一个值的列表。
    • 嗯,你是绝对正确的。它似乎不起作用的原因是我的单元测试最初是如何完成的。当使用testing.DummyRequest(params={'query': 'foo'}) .getall('query') 每次都失败。但是当使用 multidict 给出值或将其留空时,它起作用了。
    【解决方案2】:

    根据docs,我认为您需要将其作为params 参数传递(未测试):

    request = testing.DummyRequest(params={'query': 'keyword'})
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-13
      • 2019-06-17
      • 2018-07-06
      相关资源
      最近更新 更多