Патч - Задание класса вводит дополнительный параметр?
Первый раз с использованием патча. Я попытался исправить один из моих классов для тестирования. Без патча, пытающегося запустить, прошло мимо определения функции тестирования, но с патчем определение тестовой функции, по-видимому, требует другого параметра, и я получаю
TypeError: testAddChannelWithNamePutsChannel() takes exactly 1 argument (2 given)
Ошибка. Код проверки:
import unittest
import mock
from notification.models import Channel, addChannelWithName, deleteChannelWithName
class TestChannel(unittest.TestCase):
@mock.patch('notification.models.Channel')
def testAddChannelWithNamePutsChannel(self):
addChannelWithName('channel1')
Channel.put.assert_called_with()
Зачем нужен дополнительный параметр с патчем и какой должен быть этот параметр? Большое вам спасибо!
Ответы
Ответ 1
patch
передает исправленный объект в тестовую функцию. Его документированный здесь:
патч как декоратор функций, создающий макет для вас и прохождение его в декорированную функцию:
>>>
>>> @patch('__main__.SomeClass')
... def function(normal_argument, mock_class):
... print(mock_class is SomeClass)
...
>>> function(None)
True
Ответ 2
Патч передает экземпляр исправленного объекта вашему тестовому методу (или каждому методу тестирования, если вы исправляете уровень класса). Это удобно, потому что оно позволяет устанавливать возвращаемые значения и побочные эффекты или проверять сделанные вызовы
@patch('some_module.sys.stdout')
def test_something_with_a_patch(self, mock_sys_stdout):
mock_sys_stdout.return_value = 'My return value from stdout'
my_function_under_test()
self.assertTrue(mock_sys_stdout.called)
self.assertEqual(output, mock_sys_stdout.return_value)
Если вы просто хотите буквально исправить что-то, чтобы игнорировать его, вы можете вызвать патч со следующим вызовом
@patch('some_module.sys.stdout', Mock())
def test_something_with_a_patch(self):
Это заменяет sys.stdout в some_module макетным объектом и не передает его методу.