mock.patch 装饰器:缺少 1 个必需的位置参数:'self'
mock.patch decorator: missing 1 required positional argument: 'self'
我正在尝试在测试方法 运行:
期间修补模块 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 的使用也能以同样的方式工作。
如果我明白你想做什么,这会让你知道如何去做。
我已经让 settings.py
持有 False
到 TARGET_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()
其中 True
是 new
参数。该对象用于修补您在补丁字符串中提到的地方。这可能更优雅,但要求您手头有一个用于模拟的配置对象。
我正在尝试在测试方法 运行:
期间修补模块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 的使用也能以同样的方式工作。
如果我明白你想做什么,这会让你知道如何去做。
我已经让 settings.py
持有 False
到 TARGET_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()
其中 True
是 new
参数。该对象用于修补您在补丁字符串中提到的地方。这可能更优雅,但要求您手头有一个用于模拟的配置对象。