Как заменить класс? - PullRequest
       48

Как заменить класс?

0 голосов
/ 18 декабря 2018

Я пишу тестовые файлы для модуля Python

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

, и мне нужен побочный эффект блока B при тестировании A. Мой вопрос заключается в том, как заменить класс 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 / 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')

это напечатает макет, надеюсь, это поможет другим людям сте же проблемы.

1 Ответ

0 голосов
/ 20 декабря 2018

Как указано в комментариях, вы можете макетировать класс B, используя unittest.mock - в частности 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.См. Куда патчить для получения дополнительной информации об этом.

...