【发布时间】:2017-03-20 12:58:50
【问题描述】:
我有一个测试(django pytest)需要操作数据库中的对象。问题是在测试之后,数据库是“脏的”,其他测试失败。 我看到了一些关于 TransactionTestCase 的东西,但我不明白它是如何与 django 测试一起工作的。
这是我当前代码的一个简单示例:
@pytest.mark.django_db
def test_something(mock_my_obj):
mock_my_obj.save()
# test test test
...
# I don't want to delete the obj here...
更新: 第二次尝试:我读到TestCase 应该使用事务并为每个测试回滚它们。不适合我:
from django.test import TestCase
class MyTests(TestCase):
def test_yair_a(self):
print 'AAAAAAA'
print Account.objects.all()
Account.objects.create(account_id=1,account_name='1')
print Account.objects.all()
def test_yair_b(self):
print 'BBBBBBBB'
print Account.objects.all()
Account.objects.create(account_id=2,account_name='2')
print Account.objects.all()
结果(有趣的部分):
> py.test -s -v -k test_yair
AAAAAAA
[]
[<Account: 1>]
PASSED
BBBBBBBB
[<Account: 1>]
[<Account: 1>, <Account: 2>]
PASSED
表示在 test_a 结束时没有事务回滚。
【问题讨论】:
-
这很奇怪。 The docs 声明测试事务在每次测试后回滚。也许它与您注入对象有关,而不是在测试函数本身中创建它。
-
我不这么认为 - 模拟只是一个对象。我将它保存到测试本身的数据库中
-
你能发一个minimal working example吗?
-
按照我理解文档的方式,TestCase 为类中的所有测试保留数据库,然后将它们回滚。请为您的简单 pytest 测试发布 MWE。
-
@NilsWerner 因为我使用 django,所以 MWE 将包含模型文件和 django 设置。我认为我的示例非常简单明了。
标签: python django pytest-django