gpt4 book ai didi

django - 如何正确使用django testcase的addCleanup方法?

转载 作者:行者123 更新时间:2023-11-28 20:48:11 24 4
gpt4 key购买 nike

我有一个 APITestCase 的测试子类,我在其中使用类方法 setUpTestData 为我的测试和一些模拟创建数据。基本上我想做的是运行 mock.patch.stopall(如下所示),但它不起作用。

我的实现基于 THIS ANSWER我正在使用:Django v2.2.4 和 djangorestframework v3.10.2

import mock
from rest_framework.test import APITestCase


class FooTest(APITestCase):

@classmethod
def setUpTestData(cls):
patcher_one = mock.patch('route.one')
mock_route_one = patcher_one.start()

patcher_two = mock.patch('route.two')
mock_route_one = patcher_two.start()

cls.addCleanup(mock.patch.stopall)

# etc

super(FooTest, cls).setUpTestData()

使用此代码运行我的测试时,我得到:

TypeError: addCleanup() missing 1 required positional argument: 'function'

所以我将 addCleanup 调用编辑为:

cls.addCleanup(function=mock.patch.stopall)

但我得到以下信息:

TypeError: addCleanup() missing 1 required positional argument: 'self'

编辑为:

cls.addCleanup(cls, function=mock.patch.stopall)

我明白了

AttributeError: type object 'FooTest' has no attribute '_cleanups'

此时我有点迷茫。

我使用的解决方法是在 tearDownClass 方法中执行此操作:

@classmethod
def tearDownClass(cls):
mock.patch.stopall()

但我想将所有测试逻辑集中在 setUpTestData 方法中。

有人看到我哪里搞砸了吗?

最佳答案

没有实例就不能调用实例方法。 Django 的 setUpTestData 是一个类方法。

addCleanUp 代码(Django 子类 Unittest.TestCase):

def addCleanup(self, function, *args, **kwargs):
"""Add a function, with arguments, to be called when the test is
completed. Functions added are called on a LIFO basis and are
called after tearDown on test failure or success.

Cleanup items are called even if setUp fails (unlike tearDown)."""
self._cleanups.append((function, args, kwargs))

您应该做的是将模拟移至设置方法。首先,您应该调用 self.addcleanup(patch.stopall) 以确保即使在设置方法中发生错误时您的模拟也会停止(有时是可能的),接下来您将开始模拟。这在 python 文档的 here 中有解释。 .

下面的代码看起来应该与此类似:

class FooTestCase(TestCase):
def setUp(self):
super().setUp()
self.addCleanup(patch.stopall)
patch('route.one').start()

关于django - 如何正确使用django testcase的addCleanup方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57841253/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com