2017-01-10 5 views
0

Недавно я начал работу над проектом Django. Для начала я прочитал book on TDD with Python и официальную документацию (для tests). И еще несколько блогов.Django - Написание блок-тестов с помощью mocks

Одна вещь, которую я замечаю, они пишут тесты, которые получают доступ к моделям баз данных. Рассмотрим следующий фрагмент кода here

def test_home_page_can_save_a_POST_request(self): 
    request = HttpRequest() 
    request.method = 'POST' 
    request.POST['item_text'] = 'A new list item' 

    response = home_page(request) 

    self.assertEqual(Item.objects.count(), 1) 
    new_item = Item.objects.first() 
    self.assertEqual(new_item.text, 'A new list item') 

Испытание утверждающий ли число Item объектов 1. Таким образом, тест на самом деле добавляет и извлекает данные из базы данных. Разве это не сделало бы тест медленным?

Если тесты распараллелены, этот тестовый пример может завершиться неудачно, если есть еще один тест, который добавляет объект Item, верно?

Как насчет методов/объектов патчей? Выше фрагмент кода может быть переработан, как этот

@patch('my_app.views.Item') 
def test_home_page_can_save_a_POST_request(self, mock_item): 
    request = HttpRequest() 
    request.method = POST 
    request.POST['item_text'] = 'A new list item' 

    response = home_page(request) 

    self.assertTrue(mock_item.objects.create.called) 

Я новичок в Django, и я не знаком с практикой. В учебниках, которые я посетил, были написаны тесты, которые говорят с базой данных. Я хотел бы знать, является ли это конвенцией для тестирования в проектах Django. Является ли второй фрагмент (с использованием патчей и макетов) превосходным в экосистеме Django?

Редактировать: То же самое с формами также - Издевательский form.is_valid метод для возврата True или False, при условии, что существуют отдельные модульные тесты для форм.

P.S. TDD с Python - потрясающая книга, которая очень помогла мне в посадке. Я определенно рекомендую это всем, кто изучает Django.

+0

Испытания, выполняемые в их собственных транзакциях, не зависят друг от друга, насколько доступны данные/ожидаемые данные. (Спасибо за указатель на книгу - отлично!) –

ответ

1

Если вы хотите протестировать свои модели, вы вряд ли сможете обойти базу данных, и да, действительно, это может сделать тесты несколько медленнее, даже если используется SQLite в SQL-памяти в памяти, что может привести к другим проблемам FWIW, поскольку SQLite является не прозрачная замена для чего-то вроде PostgreSQL.

Но если какая-либо модель или другая функция/объект/метод, которые вы вызываете в своих представлениях, имеют свой собственный unittest, и вы хотите только проверить свои взгляды на ожидаемые вызовы, насмешливая жизнеспособная стратегия - на самом деле, вероятно, более здравая, чем тестирование результатов ожидаемых вызовов (которые в основном превращают ваши unittests в интеграционные тесты).

+0

Я считаю, что то же самое относится и к формам. Я могу высмеять 'form.is_valid', чтобы вернуть' True' или 'False' и проверить мой SUT. Конечно, после написания модульных тестов для форм. – shar

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