首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Django测试-所有测试中的补丁对象

Django测试-所有测试中的补丁对象
EN

Stack Overflow用户
提问于 2014-09-16 06:06:10
回答 3查看 21K关注 0票数 40

我需要为我的测试创建某种类型的MockMixin。它应该包含对调用外部源的所有内容的模拟。例如,每次我在管理面板中保存模型时,我都会调用一些远程URL。这将是很好的,有这样的嘲笑和使用:

代码语言:javascript
运行
复制
class ExampleTestCase(MockedTestCase):
    # tests

因此,每次我在admin中保存模型时,例如在功能测试中,都会应用这个mock,而不是调用远程URL。

这真的可能吗?对于一个特定的测试,我可以做到这一点,这不是问题。但有一些全局模拟会更有用,因为我经常使用它。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-09-16 06:11:05

根据mock documentation的说法

补丁可以用作TestCase类装饰器。它通过装饰类中的每个测试方法来工作。当您的测试方法共享一个公共补丁集时,这可以减少样板代码。

这基本上意味着您可以创建一个应用了@patch装饰器的基本测试类,它将模拟您的外部调用,而内部的每个测试方法都将被执行。

此外,您还可以分别在setUp()tearDown()方法中使用start() and stop()补丁程序的方法:

代码语言:javascript
运行
复制
class BaseTestCase(TestCase):
    def setUp(self):
        self.patcher = patch('mymodule.foo')
        self.mock_foo = self.patcher.start()

    def tearDown(self):
        self.patcher.stop()
票数 52
EN

Stack Overflow用户

发布于 2015-07-29 04:21:46

添加到alecxe's answer中,如果您使用的是teardown(),那么according to the docs

您必须通过调用stop来确保修补已“撤消”。这可能比您想象的要麻烦,因为如果在setUp中引发异常,则不会调用tearDown

如果在您的测试中引发异常,您的补丁将无法撤消。更好的方法是在setUp()中调用addCleanup()。然后,您可以完全省略tearDown()方法。

代码语言:javascript
运行
复制
class BaseTestCase(TestCase):
    def setUp(self):
        self.patcher = patch('mymodule.foo')
        self.mock_foo = self.patcher.start()
        self.addCleanup(self.patcher.stop) # add this line
票数 30
EN

Stack Overflow用户

发布于 2019-09-09 05:12:26

我最终创建了一个测试跑步器来服务于我的目的。我需要模拟文件存储,以便在测试时映像不会实际写入文件系统。在许多测试中都调用了图像对象,因此修补每个类都不是DRY。此外,我注意到模拟文件本身会将其留在系统中,以防测试失败。但是这个方法没有。

我在项目根目录中创建了一个文件runner.py

代码语言:javascript
运行
复制
# runner.py
from unittest.mock import patch

from django.test.runner import DiscoverRunner

from myapp.factories import ImageFactory


class UnitTestRunner(DiscoverRunner):

    @patch('django.core.files.storage.FileSystemStorage.save')
    def run_tests(self, test_labels, mock_save, extra_tests=None, **kwargs):
        mock_save.return_value = ImageFactory.get_image()
        return super().run_tests(test_labels, extra_tests=None, **kwargs)

然后我将使用python manage.py tests --testrunner=runner.UnitTestRunner运行我的测试

为了清楚起见,ImageFactory.get_image方法是一个自定义方法

代码语言:javascript
运行
复制
from django.core.files.base import ContentFile
from factory.django import DjangoModelFactory
from io import BytesIO
from PIL import Image as PilImage
from random import randint

class ImageFactory(DjangoModelFactory):

    @classmethod
    def get_image(cls, name='trial', extension='png', size=None):
        if size is None:
            width = randint(20, 1000)
            height = randint(20, 1000)
            size = (width, height)

        color = (256, 0, 0)

        file_obj = BytesIO()
        image = PilImage.new("RGBA", size=size, color=color)
        image.save(file_obj, extension)
        file_obj.seek(0)
        return ContentFile(file_obj.read(), f'{name}.{extension}')
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25857655

复制
相关文章

相似问题

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