Подтвердить что ты не робот

Как вызвать себя в макет методе объекта в Python?

Я пытаюсь проверить некоторые коды, которые ничего не возвращают, кроме сохранения результата в БД. Издеваясь над методом сохранения, я хочу проверить, правильно ли обработано:

def mock_save(self):
    assert(self.attr, 'dest_val')
with mock.patch.object(Item, "save", create=True) as save:
    save.side_effect = mock_save
    func_to_call() //in func_to_call, I call item.save()

Однако, похоже, это запрещено. В нем говорится, что количество несоответствий аргументов.

Если я делаю def mock_save(), это не сработает.

Как я могу ссылаться на объект, на который действует макет? (Я видел его в другом потоке, который применим к init методу, который может быть вызван непосредственно из класса)

4b9b3361

Ответ 1

Вам нужно autospec=True

def mock_save(self):
    assert self.attr == 'dest_val'
with mock.patch.object(Item, "save", autospec=True) as save:
    save.side_effect = mock_save
    func_to_call()

Ответ 2

Иногда вы просто хотите проверить, что метод был вызван, но вы не можете контролировать, где его экземпляр класса или вызванный метод. Здесь подход, который мог бы сэкономить некоторое время тому, кто наткнется на этот шаблон:

# first get a reference to the original unbound method we want to mock
original_save = Item.save
# then create a wrapper whose main purpose is to record a reference to `self`
# when it will be passed, then delegates the actual work to the unbound method
def side_fx(self, *a, **kw):
    side_fx.self = self
    return original_save(self, *a, **kw)
# you're now ready to play
with patch.object(Item, 'save', autospec=True, side_effect=side_fx) as mock_save:
    data = "the data"
    # your "system under test"
    instance = SomeClass()
    # the method where your mock is used
    instance.some_method(data) 

    # you now want to check if it was indeed called with all the proper arguments
    mock_save.assert_called_once_with(side_fx.self, data)