首页 > 解决方案 > 如何更换班级?

问题描述

我正在为 Python 模块编写测试文件

class A:
    def func(self):
        B().sub_func()
class B:
    def sub_func(self):
        pass

我需要在测试 A 时阻止 B 的副作用。我的问题是如何替换测试文件中的 B 类。

class ATest(unittest.TestCase):
    def test_a(self):
        a=A()
        a.func()
        #now object a will invoke a func that B is a mock class

按照接受答案的指示。我完成了我的测试

tws/main.py

class A(object):
    def func(self):
        b=B()
        print('func ')
        b.sub_func()
class B(object):
    def sub_func(self):
        print('real sub')
        c=C()
        c.c_sub_func()
class C(object):
    def c_sub_func(self):
        print('c')

测试/test_mock.py

import unittest
from unittest.mock import patch
from tws.main import A
class B():
    def sub_func(self):
        print('mock')
        return 12
class TestMock(unittest.TestCase):
    @patch('tws.main.B',new=B)
    def test_af(self):
        a=A()
        print(a.__dict__)
        a.func()
        print('rrr')

它会打印模拟,希望它能帮助其他有同样问题的人。

标签: pythonmockingpython-unittest

解决方案


正如评论中所建议的,您可以使用unittest.mock- 特别是模拟 B 类patch()

你可以patch()在你的测试方法中使用装饰器,确保你添加一个额外的参数来接收模拟类 B:

from unittest.mock import patch

class ATest(unittest.TestCase):

    @patch('package.module.B')
    def test_a(self, mock_b):  # mock_b will hold the mocked class B
        a = A()
        a.func()

请注意,您传递给装饰器的路径必须是使用B 的路径(包含类 A 的同一模块) ,而不是定义类 B 的路径。有关更多信息,请参阅修补程序的位置。


推荐阅读