0

我正在尝试模拟一个在我要测试的类的构造函数中实例化的类。如果我在与我尝试测试的模块相同的模块中定义我试图模拟的类,那么一切正常,但是当它们位于单独的模块中时,我会出错。

这是我的示例,取自此处(请注意,在我的真实示例中,测试类位于“tests”子模块中,其他两个文件位于“app.src.code ...”模块中。

我错过了什么?

助手.py:

import os

class Helper:
    def __init__(self, path):
        self.path = path

    def get_path(self):
        base_path = os.getcwd()
        return os.path.join(base_path, self.path)

工人.py:

from helper import Helper

class Worker:    
    def __init__(self):
        self.helper = Helper('db')

    def work(self):
        path = self.helper.get_path()
        print(f'Working on {path}')
        return path

test_worker.py:

import unittest
from unittest.mock import patch
from worker import Worker


class WorkerTest(unittest.TestCase):
    def test_patching_class(self):
        with patch('helper.Helper') as MockHelper:
            MockHelper.return_value.get_path.return_value = 'testing'
            worker = Worker()
            MockHelper.assert_called_once_with('db')
            self.assertEqual(worker.work(), 'testing')
4

1 回答 1

0

您需要使用补丁装饰器为模块的Helper类创建模拟。helper.py

例如

helper.py

import os


class Helper:
    def __init__(self, path):
        self.path = path

    def get_path(self):
        base_path = os.getcwd()
        return os.path.join(base_path, self.path)

worker.py

from helper import Helper


class Worker:
    def __init__(self):
        self.helper = Helper('db')

    def work(self):
        path = self.helper.get_path()
        print(f'Working on {path}')
        return path

test_worker.py

import unittest
from unittest.mock import patch
from worker import Worker


class TestWorker(unittest.TestCase):
    def test_work(self):
        with patch('worker.Helper') as mock_Helper:
            mock_helper_instance = mock_Helper.return_value
            mock_helper_instance.get_path.return_value = 'testing'
            worker = Worker()
            mock_Helper.assert_called_once_with('db')
            self.assertEqual(worker.work(), 'testing')


if __name__ == '__main__':
    unittest.main()

带有覆盖率报告的单元测试结果:

Working on testing
.
----------------------------------------------------------------------
Ran 1 test in 0.001s

OK
Name                                        Stmts   Miss  Cover   Missing
-------------------------------------------------------------------------
src/stackoverflow/61008064/helper.py            7      3    57%   6, 9-10
src/stackoverflow/61008064/test_worker.py      13      0   100%
src/stackoverflow/61008064/worker.py            8      0   100%
-------------------------------------------------------------------------
TOTAL                                          28      3    89%
于 2020-04-27T06:47:06.750 回答