2012-06-01 8 views
12

Я создаю простое веб-приложение в tornado.web, используя mongodb в качестве бэкэнд. 90% серверной кодовой базы находится в наборе RequestHandlers, а 90% объектов данных - json. В результате основной пример использования для обработчиков тестов:модульное тестирование в торнадо

"Given Request Y and DB in state X, 
verify that handler method Z returns json object J" 

Как настроить такой тест?

Я нашел несколько сообщений в блоге и темы обсуждения по этой теме, но в основном они сосредоточены на настройке асинхронного. Я ничего не могу найти при настройке правильного типа состояния БД или аргументов запроса GET/POST.

+0

Давайте начнем щедрость. Меня тоже интересует этот вопрос. –

+0

Я спросил у некоторых разработчиков торнадо этот вопрос в автономном режиме, и ответ, который они мне дали, это «Это очень сложно». – Abe

+0

Лучшим ответом может быть «использование толстых моделей и тощих контроллеров». Контроллерам сложно провести единичный тест, но если логика проверки и манипулирования объектами живет в моделях, мы все равно можем ее протестировать. – Abe

ответ

13

я обычно насмехаться из входов и просто протестировать выход. Это надуманный пример, использующий эту издевательскую библиотеку - http://www.voidspace.org.uk/python/mock/. Вы должны были бы высмеять правильную функцию запроса mongodb. Я не уверен, что вы используете.

from mock import Mock, patch 
import json 


@patch('my_tornado_server.mongo_db_connection.query') 
def test_a_random_handler_returns_some_json(self, mock_mongo_query): 

    request = Mock() 
    # Set any other attributes on the request that you need 
    mock_mongo_query.return_value = ['pink', 'orange', 'purple'] 

    application = Mock() 
    handler = RandomHandler(application, request) 
    handler.write = Mock() 

    handler.get('some_arg') 

    self.assertEqual(handler.write.call_args_list, json.dumps({'some': 'data'})) 
+0

Проблема Mocks заключается в том, что если нам нужно изменить db-схему/хранилище - мы должны изменить все mocks. –

+1

Не, если возвращаемое значение макета происходит от того, где вы определяете свою схему db. – aychedee

+0

Ou Я вижу, в этом случае мы не тестируем данные, которые будут фактически возвращены монго. –

Смежные вопросы