我有两个测试,每个测试对我的代码中使用的方法的返回值进行不同的修补。当我分别运行测试时,它们会通过。如果我一起运行它们,我可以看到unittest在第二次测试中使用了错误的补丁。
我曾尝试使用装饰器语法来修补补丁,甚至尝试将测试更改为pytest,还尝试过使用鼻子运行测试。我遇到了同样的问题,因为第二个测试的结果是“ foo”而不是“ bar”。
是否可以按顺序运行测试?我在这里错过了什么?我们是否可以假设我无法更改正在测试的课程,例如使用依赖注入而不是打补丁。假设我必须使用修补程序。
import unittest
from unittest.mock import patch
from unittest.mock import MagicMock
class TestMember(unittest.TestCase):
def setUp(self):
pass
def test_1(self):
test_json = {
"something-123": []
}
mock = MagicMock()
mock.return_value = test_json
with patch('imported_module.get_json', mock):
from some_module import some_method
result = some_method()
self.assertEqual(result, "foo")
def test_2(self):
test_json = {
"something-else-123": []
}
mock = MagicMock()
mock.return_value = test_json
with patch('imported_module.get_json', mock):
from some_module import some_method
result = some_method()
self.assertEqual(result, "bar")
if __name__ == '__main__':
unittest.main()
我正在测试的课程:
from imported_module import get_json
def some_method():
json_obj = get_json()
if "something-123" in json_obj.keys():
return "foo"
else:
return "bar"
为完整起见,这是imported_module代码:
def get_json():
return {}
答案 0 :(得分:1)
您需要在使用get_json
的地方(some_module
)而不是在定义的地方(imported_module
)进行修补。这是因为patch()
修补了受测代码使用的名称。
如果您更新patch()
来执行此操作,则测试将按预期通过:
with patch('some_module.get_json', mock):
有关在何处修补here的更多信息。