Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Django';在测试的时候,你会选择什么样的模型?_Python_Django_Testing_Monkeypatching - Fatal编程技术网

Python 如何在Django';在测试的时候,你会选择什么样的模型?

Python 如何在Django';在测试的时候,你会选择什么样的模型?,python,django,testing,monkeypatching,Python,Django,Testing,Monkeypatching,我的模型中有一个@memoize装饰器,它可以缓存模型本身的一些细节,以避免多次调用(尤其是在模板中)时多次调用数据库。然而,由于我存储了对象并在测试中引用它们,这就破坏了一切 例如,如果我执行mygroup.subscribers,添加一个订阅者并重试,它将返回一个错误的订阅者数量,因为它已被记录 我怎么能在我的tests.py中不做任何事情来修补那个装饰程序呢?我还没有找到一种干净的方法,因为首先加载模型。在memoize实现的开始,检查它是否处于测试模式,如下所示: 您可以在中禁用deco

我的模型中有一个
@memoize
装饰器,它可以缓存模型本身的一些细节,以避免多次调用(尤其是在模板中)时多次调用数据库。然而,由于我存储了对象并在测试中引用它们,这就破坏了一切

例如,如果我执行
mygroup.subscribers
,添加一个订阅者并重试,它将返回一个错误的订阅者数量,因为它已被记录


我怎么能在我的tests.py中不做任何事情来修补那个装饰程序呢?我还没有找到一种干净的方法,因为首先加载模型。

memoize
实现的开始,检查它是否处于测试模式,如下所示:


您可以在中禁用decorator,测试环境将在加载模型之前设置

例如:

from django.test.simple import DjangoTestSuiteRunner
from utils import decorators

class PatchTestSuiteRunner(DjangoTestSuiteRunner):
    def setup_test_environment(self, **kwargs):
        super(PatchTestSuiteRunner, self).setup_test_environment(**kwargs)
        self.__orig_memoize = decorators.memoize
        decorators.memoize = lambda x: x

    def teardown_test_environment(self, **kwargs):
        decorators.memoize = self.__orig_memoize
        super(PatchTestSuiteRunner, self).teardown_test_environment(**kwargs)
然后输入您的
设置。py

TEST_RUNNER = 'test.PatchTestSuiteRunner'
测试可以在无需记忆的情况下运行:

# myapp/models.py
class TestObject(object):
    def __init__(self, value):
        self.value = value

    @memoize
    def get_value(self):
        return self.value

# myapp/test.py
from django.test import TestCase
from .models import TestObject

class NoMemoizeTestCase(TestCase):
    def test_memoize(self):
        t = TestObject(0)
        self.assertEqual(t.get_value(), 0)
        t.value = 1
        self.assertEqual(t.get_value(), 1)

请注意,尽管我们正在测试运行程序的
teardown\u test\u环境
中恢复原始的装饰程序,但不会在已装饰的函数上恢复记忆。如果我们使用更复杂的测试装饰器,则可以恢复记忆,但这在标准用例中可能不是必需的。

我宁愿避免在那里添加测试代码,因为我希望保留tests.py中包含的测试代码。不过,谢谢你的回答!
# myapp/models.py
class TestObject(object):
    def __init__(self, value):
        self.value = value

    @memoize
    def get_value(self):
        return self.value

# myapp/test.py
from django.test import TestCase
from .models import TestObject

class NoMemoizeTestCase(TestCase):
    def test_memoize(self):
        t = TestObject(0)
        self.assertEqual(t.get_value(), 0)
        t.value = 1
        self.assertEqual(t.get_value(), 1)