模拟静态方法调用的模块函数不起作用

问题描述 投票:0回答:1

好的,所以我有一系列Python3代码,如下所示:


foo.py

from bar import ClassB

class ClassA:

    @staticmethod
    def get_all(fn):
        something = ClassB(fn)
        return something.lines()

把人.朋友

def baz(f):
    with open(f, 'rt') as fin:
        ln = fin.readlines()
    return ln

class ClassB:

    def __init__(self, f):
        self._baz = baz(f)

    def lines():
        return self._baz

现在我写一个像这样的单元测试:

test_foo.朋友

from unittest import TestCase, mock
from foo import ClassA

class Test_A(TestCase):

    @mock.patch("bar.baz")
    def setUp(self, mock_baz):
        mock_baz.return_value = ['a', 'b']

    def test_1(self):
        self.assertEqual(ClassA.get_all('whatever'), ['a', 'b']

问题:

运行测试会导致FileNotFoundError,这意味着mock.patch("bar.baz")不起作用。

我如何解决这个问题,以便baz()函数被正确模拟?

python python-3.x python-unittest python-unittest.mock
1个回答
1
投票

看来您的补丁不适用于您的测试 - 您正在嘲笑的功能仅在setUp本身中被嘲笑。您可以尝试以下两种解决方案之一:

在setUp中手动创建补丁:

class Test_A(TestCase):

    def setUp(self):
        mock_baz = mock.Mock(return_value=['a', 'b'])
        self.baz_patch = mock.patch("bar.baz", mock_baz)
        self.baz_patch.start()

    def tearDown(self):
        self.baz_patch.stop()
    ...

或者,仅在您的测试中模拟它:

class Test_A(TestCase):

    @mock.patch("bar.baz")
    def test_1(self, mock_baz):
        mock_baz.return_value = ['a', 'b']
        self.assertEqual(ClassA.get_all('whatever'), ['a', 'b']
© www.soinside.com 2019 - 2024. All rights reserved.