Python Unittest 在 运行 测试时不隔离补丁
Python Unittest is not isolating patches when running tests
我有两个测试,每个测试都对我代码中使用的方法的 return 值进行了不同的修补。当我 运行 分别进行测试时,它们通过了。如果我 运行 他们在一起,我可以看到 unittest 在第二次测试中使用了错误的补丁。
我已经尝试过使用装饰器语法来修补,我什至尝试过将测试更改为 pytest,我还尝试过 运行使用 nose 测试。我 运行 遇到了同样的问题,因为第二次测试得到的结果是 "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()
Class 我正在测试:
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 {}
您需要在使用 (some_module
) 的地方修补 get_json
,而不是在定义 (imported_module
) 的地方修补。那是因为 patch()
修补了被测代码使用的 name。
如果您更新 patch()
来执行此操作,则测试会按预期通过:
with patch('some_module.get_json', mock):
有关修补位置的更多信息 here。
我有两个测试,每个测试都对我代码中使用的方法的 return 值进行了不同的修补。当我 运行 分别进行测试时,它们通过了。如果我 运行 他们在一起,我可以看到 unittest 在第二次测试中使用了错误的补丁。
我已经尝试过使用装饰器语法来修补,我什至尝试过将测试更改为 pytest,我还尝试过 运行使用 nose 测试。我 运行 遇到了同样的问题,因为第二次测试得到的结果是 "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()
Class 我正在测试:
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 {}
您需要在使用 (some_module
) 的地方修补 get_json
,而不是在定义 (imported_module
) 的地方修补。那是因为 patch()
修补了被测代码使用的 name。
如果您更新 patch()
来执行此操作,则测试会按预期通过:
with patch('some_module.get_json', mock):
有关修补位置的更多信息 here。