Удвоение объектов в 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)
Другие вопросы по тегам