Тестирование юнит-ресурса 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'})