我正在测试 python 代码(一个 django 3.0.5 项目,尽管我认为它不相关),但我无法调用我的模拟对象的函数。这是我的代码:
**myproject.mypackage.myhelpers**
def get_dict():
return dict()
**myproject.mypackage.mythings**
from .myhelpers import get_dict
def use_dict():
the_dict = get_dict()
pass
return
**myproject.tests.test_mythings**
from ..mypackage import mythings
import unittest
import unittest.mock as mock
class MyThingsTests(unittest.TestCase):
@mock.patch('myproject.mypackage.myhelpers')
def test_using_dict(self, mock_myhelpers):
test_dict = {
"hi": "foo",
"there": "bar",
"sir": "foobar"
}
mock_myhelpers.get_dict.return_value = test_dict
mythings.use_dict()
mock_myhelpers.get_dict.assert_called_once()
但最终测试失败并出现错误:
AssertionError: Expected 'get_dict' to have been called once. Called 0 times
试试这个:
@mock.patch('myproject.mypackage.mythings.get_dict')
def test_using_dict(self, mock_get_dict):
test_dict = {
"hi": "foo",
"there": "bar",
"sir": "foobar"
}
mock_get_dict.return_value = test_dict
The 哪里打补丁 https://docs.python.org/3/library/unittest.mock.html#where-to-patch文档的部分对此进行了一些解释。
从我的理解来看,myproject.mypackage.mythings
已经导入了“真实的”get_dict
在你打补丁之前。所以如果你像这样修补它@mock.patch('myproject.mypackage.myhelpers')
, 只有myhelpers
模块将“知道”它已被修补。这mythings
模块仍然会引用真实的get_dict
.
我认为上述修补方式的替代方法是更改导入方式get_dict
反而。而不是导入get_dict
直接导入即可myhelpers
并使用get_dict
as myhelpers.get_dict
。那么你应该能够保持你的修补方式相同,因为get_dict
将会从myhelpers
这将有修补方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)