如何模拟 python3 中另一个模块的变量?
How to mock a variable from another module in python3?
下面是我的源代码
#src.py
from common.configs import MANDATORY_FIELDS
def check_mf():
if set(MANDATORY_FIELDS).issubset(['a','b','c']):
return True
else:
raise Exception("Error in mandatory fields")
这是我的测试代码
#test_src.py
from unittest import TestCase, main, mock
from src import check_mf
class TestMailSenderUtil(TestCase):
def test_method(self):
with mock.patch('src.MANDATORY_FIELDS') as mocked_mf:
mocked_mf.return_value = ['a','b','c','d']
self.assertRaises(ValidationException, check_mf)
当我 运行 此代码时,测试未通过。它抛出一个错误说
AssertionError: ValidationException not raised by check_mf
为什么会出现此错误?
仅供参考,当我尝试在 src.py 文件中打印 MANDATORY_FIELDS 而 运行 宁单元测试时,我得到了这个
<MagicMock name='MANDATORY_FIELDS' id='139766761401144'>
为什么模拟在这里不起作用?
变量 MANDATORY_FIELDS
没有 return_value
。只需将 new
值作为 patch().
的第二个参数传递
例如(Python 3.9.2)
src.py
:
from configs import MANDATORY_FIELDS
class ValidationException(Exception):
pass
def check_mf():
print(MANDATORY_FIELDS)
if set(MANDATORY_FIELDS).issubset(['a', 'b', 'c']):
return True
else:
raise ValidationException("Error in mandatory fields")
configs.py
:
MANDATORY_FIELDS=['a']
test_src.py
:
from unittest import TestCase, main, mock
from src import check_mf, ValidationException
class TestMailSenderUtil(TestCase):
def test_method(self):
with mock.patch('src.MANDATORY_FIELDS', ['a', 'b', 'c', 'd']) as mocked_mf:
self.assertRaises(ValidationException, check_mf)
if __name__ == '__main__':
main()
单元测试结果:
['a', 'b', 'c', 'd']
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
Name Stmts Miss Cover Missing
----------------------------------------------------------------------
src/Whosebug/68162471/configs.py 1 0 100%
src/Whosebug/68162471/src.py 8 1 88% 9
src/Whosebug/68162471/test_src.py 8 0 100%
----------------------------------------------------------------------
TOTAL 17 1 94%
下面是我的源代码
#src.py
from common.configs import MANDATORY_FIELDS
def check_mf():
if set(MANDATORY_FIELDS).issubset(['a','b','c']):
return True
else:
raise Exception("Error in mandatory fields")
这是我的测试代码
#test_src.py
from unittest import TestCase, main, mock
from src import check_mf
class TestMailSenderUtil(TestCase):
def test_method(self):
with mock.patch('src.MANDATORY_FIELDS') as mocked_mf:
mocked_mf.return_value = ['a','b','c','d']
self.assertRaises(ValidationException, check_mf)
当我 运行 此代码时,测试未通过。它抛出一个错误说
AssertionError: ValidationException not raised by check_mf
为什么会出现此错误? 仅供参考,当我尝试在 src.py 文件中打印 MANDATORY_FIELDS 而 运行 宁单元测试时,我得到了这个
<MagicMock name='MANDATORY_FIELDS' id='139766761401144'>
为什么模拟在这里不起作用?
变量 MANDATORY_FIELDS
没有 return_value
。只需将 new
值作为 patch().
例如(Python 3.9.2)
src.py
:
from configs import MANDATORY_FIELDS
class ValidationException(Exception):
pass
def check_mf():
print(MANDATORY_FIELDS)
if set(MANDATORY_FIELDS).issubset(['a', 'b', 'c']):
return True
else:
raise ValidationException("Error in mandatory fields")
configs.py
:
MANDATORY_FIELDS=['a']
test_src.py
:
from unittest import TestCase, main, mock
from src import check_mf, ValidationException
class TestMailSenderUtil(TestCase):
def test_method(self):
with mock.patch('src.MANDATORY_FIELDS', ['a', 'b', 'c', 'd']) as mocked_mf:
self.assertRaises(ValidationException, check_mf)
if __name__ == '__main__':
main()
单元测试结果:
['a', 'b', 'c', 'd']
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
Name Stmts Miss Cover Missing
----------------------------------------------------------------------
src/Whosebug/68162471/configs.py 1 0 100%
src/Whosebug/68162471/src.py 8 1 88% 9
src/Whosebug/68162471/test_src.py 8 0 100%
----------------------------------------------------------------------
TOTAL 17 1 94%