模拟在不同模块中导入的类

2024-05-29 04:04:20 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有这些模块:

a.py

class C:
    ...

b.py

from a import C
...
def foo():
   c = C()
   ...
...

现在我想为模块b编写一个测试

test_b.py

import unittest
import mockito

from b import foo


class TestB(unittest.TestCase):
   def test_foo():
      actual = foo()
      ...

我希望在测试期间“控制”foo()的行为,并且我希望在test_foo()运行期间,用自定义行为替换在foo()内创建C()时,它不是“真实的”C类,而是模拟类 我怎样才能做到这一点


Tags: 模块frompytestimportfoodefunittest
2条回答

您必须将import b分配到test_b.py中,然后将模拟类分配给b.C,如下所示:

import unittest

import b

class TestB(unittest.TestCase):
    class MockC:
        def talk(self):
            return 'Mocked C'

    def test_foo(self):
        b.C = self.MockC
        talk = b.foo()  # returns C().talk()
        assert talk == 'Mocked C'  # ok

您可以使用unittest.mock.patch

import unittest.mock

from a import C
from b import foo

class MockC:
    ...

class TestB(unittest.TestCase):
   def test_foo():
        with unittest.mock.patch('a.C', new=MockC):
            actual = foo() # inside foo C will be the MockC class
            ...

相关问题 更多 >

    热门问题