Как заменить метод во время тестирования в Python? - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь заменить функцию метода во время тестирования. Оригинальный метод сложен, поэтому я хочу использовать простую функцию для его замены в тестировании.

Я пытался использовать фиктивную библиотеку. Но похоже, что он только изменяет объект, непосредственно созданный в тестовом примере. Если некоторые другие функции внутри тестового примера вызывают метод, метод не будет заменен.


class1.py:

class Class1:
    def foo(self):
        #do a lot of calculation
        return 1

class2.py:

from .class1 import Class1

class Class2:
    def doo(self):
        my_class1 = Class1()
        return my_class1.foo()

test.py:

import mock
from .class1 import Class1
from .class2 import Class2

class Class1:
    def foo(self):
        # no calculation
        return 2

@mock.patch.object(Class1, "foo")
def test_case(mock):
    my_class2 = Class2()
    assert my_class2.doo() == 2

Я пытаюсь заменить foo () внутри Class1 новым foo (), созданным в test.py. Но поскольку объект Class1 создается внутри объекта Class2, метод не заменяется таким образом.

1 Ответ

0 голосов
/ 14 мая 2019

Вы должны насмехаться над правильным. Class2.doo создает экземпляр class2.Class1, а не test.Class1 (имена важны для насмешек, а class2 и test имеют свои глобальные области видимости).

import mock
import class2


@mock.patch.object(class2.Class1, 'foo', return_value=2)
def test_case(mock):
    my_class2 = class2.Class2()
    assert my_class2.doo() == 2
...