我使用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测试客户端文档,并没有找到太多。我能错过什么?
答案 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配置中的某些内容,问题就在您的代码上。