如何模拟/修补全班?

时间:2018-11-30 14:29:15

标签: python unit-testing mocking pytest

我有以下代码:

pkg1/mock_class.py:

class A:
    def ma(self):
        print(' class_A')


class B:
    def __init__(self):
        self.var = 'vvv'

    def mb(self):
        a = A()
        print('class_B')
        a.ma()

和测试代码:

from unittest import mock
import pytest
from pkg1.mock_class import B


@pytest.fixture(scope='class')
def mockA():
    with mock.patch('pkg1.mock_class.A'):
        yield

class TestB:
    def test_b(self, mockA):
        b = B()
        b.mb()

我想使用夹具来模拟整个A()类,并且我希望将来能够使用参数化来配置一些返回值。

基本-仅按上述实现的模拟/修补程序无法正常工作,B类也无法模拟,我不明白为什么。

感谢您的咨询。

Jano

1 个答案:

答案 0 :(得分:0)

上面的代码可以正常工作,我认为它不起作用,因为在实际情况下它不是-我在修补错误的地方。

摘自官方文档(link):

  

patch()通过(临时)更改名称指向的对象来工作   与另一个。可以有许多名称指向任何   单个对象,因此要进行修补工作,必须确保您   修补受测系统使用的名称。

     

基本原理是,您修补在其中查找对象的位置,   它不一定与定义的位置相同。一种   几个例子将有助于澄清这一点。