Тестовый экземпляр класса, из которого вызывается смоделированный метод в Python - PullRequest
1 голос
/ 10 марта 2020

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

В моем конкретном случае do_stuff пытается записать bar_instance в файл Excel, и я не хочу, чтобы это произошло, т.е.

def create_instance(*args):
 return Bar(*args)

class Bar():
 def __init__(self, *args):
  self.args = args
 def do_stuff(self):
  pass

def foo(*args):
 bar_instance = create_instance(*args)
 bar_instance.do_stuff()

Затем в тестовом файле

from unittest import TestCase
from unittest.mock import patch
from path.to.file import foo

class TestFoo(TestCase):
 @patch('path.to.file.Bar.do_stuff')
 def test_foo(self, mock_do_stuff):
  test_args = [1]
  _ = foo(*test_args)
  # Test here the instance of `Bar` that `mock_do_stuff` was called from
  # Something like
  actual_args = list(bar_instance.args)
  self.assertEqual(test_args, actual_args)

Я поставил перерыв в тестовой функции после запуска foo(*test_args), но не вижу никакого пути от смоделированного метода доступа к экземпляру Bar, из которого он был вызван, и я немного застрял. Я не хочу макетировать Bar далее код, поскольку хочу убедиться, что создается правильный экземпляр Bar.

1 Ответ

0 голосов
/ 10 марта 2020

Поскольку patch возвращает экземпляр Mock (или фактически MagicMock, но он наследует соответствующие методы из своей базы - Mock), у вас есть метод assert_called_with , который должен сделать свое дело. Обратите внимание, что этот метод чувствителен к args / kwargs - вы должны утверждать точно такой же вызов.

Еще одно примечание: лучше использовать patch.object вместо patch здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...