Удвоение объектов в unittest.mock
Я пытаюсь использовать unittest с unittest.mock для выполнения некоторых тестов в моем приложении.
У меня есть два класса MainClass и Caller. Я хотел бы проверить основной класс с двойным абонентом. Это вкратце то, что я имею:
class MainClass:
def __init__(self, caller):
self.caller = caller
def some_function(self):
self.caller.function1()
blab = self.caller.function2()
class Caller:
# some functions non of which should be accessed in tests
class CallerMock:
def __init__(self):
self.items = []
def function1(self):
pass
def function2(self):
return items
В тесте я делаю:
class TestMainFunction(unittest.TestCase):
def setUp(self):
self.mock = MagicMock(wraps=CallerMock())
self.main_class = MainClass(self.mock)
def test(self):
# self.main_class.caller.items = items
# self.mock.items = items
# self.mock.function2.return_value = items
self.main_class.some_functions()
# non of the above change the return value of function2
Однако проблема в том, что ни одна из закомментированных строк фактически не изменяет возвращаемое значение моей функции2. Как мне этого добиться?
Я также был бы доволен решением, в котором мне не нужно было бы удваивать, и все функции Caller возвращали бы None, и мне пришлось бы указывать возвращаемые значения функций в конкретных тестах.
1 ответ
Вы могли бы просто издеваться Caller
и залатать call()
метод. Таким образом, вам не понадобится двойной:
def setUp(self):
self.mocked_caller = mock.Mock(spec=Caller)
self.mocked_caller.call.return_value = items
self.main_class = MainClass(self.mocked_caller)
def test(self):
self.main_class.some_function()
self.assertTrue(self.mocked_caller.called)