运行测试时,Python Unittest不会隔离补丁

时间:2018-12-14 10:52:40

标签: python-3.x unit-testing python-unittest

我有两个测试,每个测试对我的代码中使用的方法的返回值进行不同的修补。当我分别运行测试时,它们会通过。如果我一起运行它们,我可以看到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 {}

1 个答案:

答案 0 :(得分:1)

您需要在使用get_json的地方(some_module)而不是在定义的地方(imported_module)进行修补。这是因为patch()修补了受测代码使用的名称

如果您更新patch()来执行此操作,则测试将按预期通过:

with patch('some_module.get_json', mock):

有关在何处修补here的更多信息。