Пересмешивание сторонней функции внутри метода класса - PullRequest
0 голосов
/ 06 февраля 2020

Это, вероятно, тривиальная проблема, но я не могу найти правильное решение, и я не понимаю, как это исправить. Я упростил задачу, поэтому у меня два файла my_module.py и test_module.py в одной и той же локализации.

import numpy as _np


class MyClass:

    def __init__(self) -> None:
        self.attribute = 1
        self.method()

    def method(self) -> None:
        arr = _np.arange(9).reshape(-1, 3)
        self.attribute = 2
from unittest.mock import Mock, patch

import pytest

from my_module import MyClass


@pytest.fixture
def init_mock():
    with patch.object(MyClass, '__init__', return_value=None) as init:
        yield init


@pytest.fixture
def method_mock():
    with patch.object(MyClass, 'method') as method:
        yield method


@pytest.fixture
def my_class_init_mock(init_mock):
    yield MyClass()


@pytest.fixture
def my_class_method_mock(method_mock):
    yield MyClass()


def test_init(my_class_method_mock):
    assert my_class_method_mock.attribute == 1


def test_method(my_class_init_mock):
    my_class_init_mock.method()
    assert my_class_init_mock.attribute == 2

Все два теста пройдены. Более того, мне нужно проверить, был ли _np.arange(9).reshape вызван один раз с -1, 3 аргументами. Я обнаружил, что должен обратиться непосредственно к numpy из my_module.py. Я пытался добавить @patch('my_module._np') выше последнего теста. Я также пытался передать приспособление модуля на приспособление my_class_method_mock. К сожалению, я не могу вызвать этот макет, когда запускаю функцию .method(). Как создать связь между ними?

1 Ответ

0 голосов
/ 07 февраля 2020

Этого можно добиться, определив фиксатор _np и проверив, был ли вызван этот макет:

@pytest.fixture
def numpy_mock():
    with patch('my_module._np') as numpy:
        yield numpy

...

def test_method(my_class_init_mock, numpy_mock):
    my_class_init_mock.method()
    numpy_mock.arange.assert_called_once_with(9)
    numpy_mock.arange().reshape.assert_called_once_with(-1, 3)
    assert my_class_init_mock.attribute == 2

Обратите внимание, что мы можем утверждать каждый фрагмент метода.

...