Django测试客户端与django-pytest

时间:2015-12-03 12:18:44

标签: python django django-rest-framework pytest pytest-django

我使用django-pytest来测试Django Rest Framework API。我有一个看起来像这样的测试模块:

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测试客户端文档,并没有找到太多。我能错过什么?

2 个答案:

答案 0 :(得分:4)

找出问题所在。我们还使用了django-cacheops,响应正在缓存而不是再次运行查询。具有讽刺意味的是,我已经认为这个问题可能与缓存有关,但是我的禁用尝试失败了,并误导我将其排除为问题的原因。最终我们想出了如何正确地禁用它。

如果你正在使用cacheops和py.test,这里可以禁用测试缓存:

from cacheops import invalidate_all

@pytest.fixture(scope='function', autouse=True)
def invalidate_cache():
    invalidate_all()

答案 1 :(得分:1)

pytest-django确实通过在每次测试结束时恢复事务来隔离测试。

如果您想在app: resource: "@AppBundle/Controller/" type: annotation 开头添加测试之前确保您的数据库没有任何工作站:

test_no_stations

如果证明这是错误的,要么您错过了pytest配置中的某些内容,问题就在您的代码上。