3

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

4

2 回答 2

5

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

如果您使用 cacheops 和 py.test,这是一种禁用测试缓存的方法:

from cacheops import invalidate_all

@pytest.fixture(scope='function', autouse=True)
def invalidate_cache():
    invalidate_all()
于 2015-12-04T14:29:27.923 回答
1

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

如果您想确保您的数据库在测试之前没有任何 Station,请在开头添加test_no_stations

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

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

于 2015-12-03T14:20:49.817 回答