python-3.x - Python Unittest 在运行测试时不会隔离补丁

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

我有两个测试,每个测试都对我的代码中使用的方法的返回值做了不同的补丁。当我单独运行测试时,它们通过了。如果我一起运行它们,我可以看到 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/

相关文章:

python - 在 python 2 和 3 中使用 input/raw_input

python - Anaconda 已安装但无法启动 Navigator

eclipse - 使用 PyDev 时如何停止/禁用 PyUnit

python - 如何在 python unittest 中为此类使用 setUp 和 tearDown

python - 列表项的assertEqual自定义比较

python - 为什么定义 __eq__ 的参数类型会引发 MyPy 类型错误?

python - 在 Pandas 中加载 .rds 文件

unit-testing - 如何测试 SqlParameter 是否相等

python - 在 Python 中模拟自定义异常

ruby-on-rails - 如何使用单元样式为集成测试配置 minitest