3

Я использую django-pytest для проверки API-интерфейса Django Rest Framework. У меня есть тестовый модуль, который выглядит примерно так:Django test client vs. django-pytest

class TestClass: 

    def test_station_is_created(self, db, api_client): 
     StationFactory(name='foo') 
     response = api_client.get(reverse('api:stations')) 
     assert response.status_code == 200 
     ... 

    def test_no_stations(self, db, api_client): 
     response = api_client.get(reverse('api:stations')) 
     assert response.data['data'] == [] 

Когда я запускаю тесты, я получаю:

________________________________ TestClass.test_no_stations________________________________ 
path/to/test/module.py:11: in test_no_stations 

E assert [OrderedDict(...01251d92f')])] == [] 
E  Left contains more items, first extra item: OrderedDict([...]) 

Если я проверить данные, возвращаемые с помощью отладчика, я вижу, что это станция создана в предыдущем тесте, даже если база данных кажется пустым:

ipdb> response.data['data'][0]['attributes']['name'] 
foo 
ipdb> len(Station.objects.all()) 
0 

Я не знаю, если pytest очищает базу данных или нет между тестами. Я подозревал, что несколько баз данных используются, но у меня есть только одна настройка в моих настройках. Хотя, возможно, есть кеширование, но я прочитал документацию клиента Django и не нашел многого. Что я могу пропустить?

ответ

1

pytest-django действительно изолируют тесты друг от друга, возвращая транзакцию в конце каждого теста.

Если вы хотите, чтобы убедиться, что база данных не имеет станции перед испытанием добавить в начале test_no_stations:

assert not Station.objects.all().exist() 

Если это доказано неправильно, либо вы пропустили что-то в вашей конфигурации pytest либо проблема связана с вашим кодом.

4

Узнал, в чем проблема. Мы также использовали django-cacheops, и ответ ударил кеш вместо того, чтобы снова выполнить запрос. Ирония заключается в том, что я уже думал, что проблема может быть связана с кешем, но моя попытка отключить ее не удалась и ввел меня в заблуждение в качестве причины проблемы. В конце концов мы выяснили, как правильно отключить его.

Вот способ, вы можете отключить кэширование для тестов, если вы используете cacheops и py.test:

from cacheops import invalidate_all 

@pytest.fixture(scope='function', autouse=True) 
def invalidate_cache(): 
    invalidate_all() 
Смежные вопросы