Ari*_*iel 4 python testing django transactions
Django 的 TestCase 类将每个测试包装在一个事务中,并在每次测试后回滚该事务,以提供测试隔离。
然而,显然只有default数据库中的操作在事务范围内。我有一个带有路由器的多数据库设置,该路由器将某些模型上的 ORM 调用定向到第二个数据库。这意味着在以下示例中,test2失败:
class MyTestCase(TestCase):
def test1(self):
# Let's say Foo model ORM calls are routed to a different DB
foo = Foo.objects.create(...)
assert foo.is_ok()
def test2(self):
assert not Foo.objects.exists()
Run Code Online (Sandbox Code Playgroud)
这个问题最直接的解决方案是覆盖tearDown方法MyTestCase并手动确保删除所有Foo对象。但这有点烦人,因为它有点像黑客,并且数据库序列(例如自动增量列)不会被重置,例如,只有在测试套件完成并且数据库被破坏之后。
有没有办法正确解决这个问题,确保所有数据库操作默认在事务中进行并在每次测试结束时回滚?
[更新]
这是我的路由器:
class FooRouter(object):
def db_for_read(self, model, **hints):
if model._meta.app_label == 'foo':
return 'foo_db'
return None
def db_for_write(self, model, **hints):
if model._meta.app_label == 'foo':
return 'foo_db'
return None
def allow_migrate(self, db, app_label, model_name=None, **hints):
if app_label == 'foo':
return db == 'foo_db'
return None
Run Code Online (Sandbox Code Playgroud)
由于multi_db已被弃用,您现在可以使用新的属性数据库实现对多个数据库的测试
class YourTestCase(TestCase):
databases = '__all__'
def test_something(self):
pass
Run Code Online (Sandbox Code Playgroud)
如果您没有使用 DB Router,您可以尝试添加multi_db = True到 TestCase 来为所有数据库调用刷新
class YourTestCase(TestCase):
multi_db = True
def test_something(self):
pass
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1922 次 |
| 最近记录: |