Нам нужно посмотреть, какой путь импорта вы на самом деле используете с path.to.MyClass.functionB
. При манипулировании объектами вы не обязательно используете путь непосредственно к месту расположения объекта, но тот, который интерпретатор видит при рекурсивном импорте модулей.
Например, если ваш тест импортирует MyClass
из myclass.py
, и этот файл импортирует functionB
из production_class.py
, путь макета будет myclass.functionB
вместо production_class.functionB
.
Тогда возникает проблема, которая требует дополнительных макеты MyClass.do_other_stuff
и MyClass.do_something_else
, чтобы проверить, вызвал ли MyClass
правильный нисходящий метод на основе возвращаемого значения functionB
.
. Вот рабочий пример, который проверяет оба возможных возвращаемых значения functionB
и вызывают ли они правильный нисходящий метод:
myclass.py
from production_class import functionA, functionB, functionM
class MyClass:
def do_something(self):
variable = functionB()
if variable:
self.do_other_stuff()
else:
self.do_something_else()
def do_other_stuff(self):
pass
def do_something_else(self):
pass
production_class.py
import random
def functionA():
pass
def functionB():
return random.choice([True, False])
def functionM():
pass
test_myclass.py
import unittest
from unittest.mock import patch
from myclass import MyClass
class MyTest(unittest.TestCase):
@patch('myclass.functionB')
@patch('myclass.MyClass.do_something_else')
def test_do_something_calls_do_something_else(self, do_something_else_mock, functionB_mock):
functionB_mock.return_value = False
instance = MyClass()
instance.do_something()
do_something_else_mock.assert_called()
@patch('myclass.functionB')
@patch('myclass.MyClass.do_other_stuff')
def test_do_something_calls_do_other_stuff(self, do_other_stuff_mock, functionB_mock):
functionB_mock.return_value = True
instance = MyClass()
instance.do_something()
do_other_stuff_mock.assert_called()
if __name__ == '__main__':
unittest.main()
вызов python test_myclass.py
приводит к:
..
----------------------------------------------------------------------
Ran 2 tests in 0.002s
OK