mock.patch装饰器:缺少1个必需的位置参数:'self'

问题描述 投票:0回答:1

我试图在测试方法运行期间修补模块settings中的变量:

from unittest import mock

class Test(...):

    @mock.patch('settings.TARGET_SCORES_PER_SECTION', True)
    def test_register_user(self):

我收到此错误:

ERROR: tests.test_user.transplant_class.<locals>.C (test_register_user)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/local/Cellar/python/3.6.5_1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/mock.py", line 1179, in patched
    return func(*args, **keywargs)
TypeError: test_register_user() missing 1 required positional argument: 'self'

我尝试了不同的方法,找不到解决方案。

我究竟做错了什么?

这个版本工作得很好:

    def test_register_user(self):
        with mock.patch('settings.TARGET_SCORES_PER_SECTION', True):
            self._test_register_user()

    def _test_register_user(self):

我希望作为decorator的使用将以同样的方式工作。

python python-3.x mocking python-mock
1个回答
0
投票

如果我理解你想要做什么,这将让你知道如何做到这一点。

我让settings.py只持有FalseTARGET_SCORES_PER_SECTION的任务。不得不在补丁中提到__main__只是有点烦恼,它不会接受不合格的名字。

import unittest
from unittest import TestCase
from unittest.mock import patch
import settings


def register_user():
    return settings.TARGET_SCORES_PER_SECTION


class Test(TestCase):

    @patch('__main__.settings')
    def test_register_user(self, mock_settings):
        # setup your mock
        mock_settings.TARGET_SCORES_PER_SECTION = True
        # test your function
        self.assertTrue(register_user())

if __name__ == '__main__':
    unittest.main()

编辑:

我想要理解更好的OP问题,如果您愿意,上面的代码也可以更改为:

import unittest
from unittest import TestCase
from unittest.mock import patch
import settings


def register_user():
    return settings.TARGET_SCORES_PER_SECTION


class Test(TestCase):

    @patch('settings.TARGET_SCORES_PER_SECTION', True)
    def test_register_user(self):
        self.assertTrue(register_user())

    if __name__ == '__main__':
        unittest.main()

其中Truenew参数。此对象用于修补您在修补程序字符串中提到的位置。这可能更优雅,但需要你有一个可配置的对象来进行模拟。

© www.soinside.com 2019 - 2024. All rights reserved.