我有两个测试,每个测试都对我的代码中使用的方法的返回值做了不同的补丁。当我单独运行测试时,它们通过了。如果我一起运行它们,我可以看到 unittest 在第二次测试中使用了错误的补丁。
我尝试使用装饰器语法进行补丁,我什至尝试将测试更改为 pytest,我还尝试使用 Nose 运行测试。我遇到了同样的问题,因为第二个测试的结果是“foo”而不是“bar”。
有没有办法按顺序运行测试?我在这里错过了什么?我们可以假设我不能更改我正在测试的类(class),例如使用依赖注入(inject)而不是打补丁。假设我必须使用补丁。
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 {}
最佳答案
您需要修补 get_json
在哪里使用它(some_module
),而不是在哪里定义它(imported_module
)。那是因为 patch()
修补被测代码使用的名称。
如果您更新您的 patch()
为此,测试会按预期通过:
with patch('some_module.get_json', mock):
更多关于在哪里打补丁的信息here .
关于python-3.x - Python Unittest 在运行测试时不会隔离补丁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53778298/