Тестирование юнит-ресурса Pyramid/Cornice со строкой запроса в URL

У меня есть ресурс Pyramid/ Cornice, для которого требуется ключевое слово? Query = в конце URL. Но я не знаю, как добавить это в объект 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')

2 ответа

Решение

В дополнение к тому, что предложил @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).

Если вам нужно протестировать эти более сложные запросы, вы можете заменить атрибут GET вашего DummyRequest на 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() немного необычно...

В соответствии с документами, я думаю, что вы должны передать его как params аргумент (не проверен):

request = testing.DummyRequest(params={'query': 'keyword'})
Другие вопросы по тегам