首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何清理在django-nose测试函数中所做的数据库更改?

如何清理在django-nose测试函数中所做的数据库更改?
EN

Stack Overflow用户
提问于 2013-02-22 01:05:00
回答 1查看 995关注 0票数 1

出于各种原因,我们使用鼻部函数测试来编写测试套件。

在为我们的Django应用程序运行测试套件时,我们希望避免从这些测试中泄漏任何数据(就像django.test.TestCase一样),因为这会导致耦合和难以诊断故障。

解决这个问题最明显的方法是一个装饰器,我们可以只包装我们想要清理的测试,但如果一个不同的解决方案可以得到我们想要的东西,我就不会这么做。

我们在PostgreSQL上运行,所以特定于Postgres的解决方案就可以了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-22 18:23:55

今天,我花了一些时间来研究这个问题,并提出了以下装饰器:

代码语言:javascript
复制
from functools import wraps

from django.db import transaction
from mock import patch

def rollback_db_changes(func):
    """Decorate a function so that it will be rolled back once completed."""
    @wraps(func)
    @transaction.commit_manually
    def new_f(*args, **kwargs):
        def fake_commit(using=None):
            # Don't properly commit the transaction, so we can roll it back
            transaction.set_clean(using)
        patcher = patch('django.db.transaction.commit', fake_commit)
        patcher.start()
        try:
            return func(*args, **kwargs)
        finally:
            patcher.stop()
            transaction.rollback()
    return new_f

我们执行补丁,这样Django测试客户端就不会在我们无法回滚的情况下关闭事务。这样就可以通过以下测试:

代码语言:javascript
复制
from django.contrib.auth.models import User

@rollback_db_changes
def test_allowed_access():
    user = User.objects.create(username='test_user')
    eq_(1, User.objects.count())


@rollback_db_changes
def test_allowed_access_2():
    user = User.objects.create(username='test_user')
    eq_(1, User.objects.count())

以前,要运行的第二个测试无法创建具有重复用户名的用户。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15008149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档