Я использую макет с Python, и мне было интересно, какой из этих двух подходов лучше (читайте: больше pythonic).
Метод первый : просто создайте фиктивный объект и используйте его. Код выглядит так:
def test_one (self):
mock = Mock()
mock.method.return_value = True
self.sut.something(mock) # This should called mock.method and checks the result.
self.assertTrue(mock.method.called)
Метод второй : используйте патч для создания имита. Код выглядит так:
@patch("MyClass")
def test_two (self, mock):
instance = mock.return_value
instance.method.return_value = True
self.sut.something(instance) # This should called mock.method and checks the result.
self.assertTrue(instance.method.called)
Оба метода делают одно и то же. Я не уверен в различиях.
Может ли кто-нибудь просветить меня?
python
unit-testing
mocking
Сардатрион - против злоупотребления SE
источник
источник
Ответы:
mock.patch
существо очень сильно отличается отmock.Mock
.patch
заменяет класс фиктивным объектом и позволяет работать с фиктивным экземпляром. Взгляните на этот фрагмент:patch
заменяетMyClass
таким образом, чтобы вы могли контролировать использование класса в вызываемых вами функциях. После исправления класса ссылки на класс полностью заменяются имитирующим экземпляром.mock.patch
обычно используется, когда вы тестируете что-то, что создает новый экземпляр класса внутри теста.mock.Mock
примеры более ясны и предпочтительнее. Если вашself.sut.something
метод создал экземплярMyClass
вместо того, чтобы получать экземпляр в качестве параметра, тоmock.patch
здесь будет уместно.источник
У меня есть видео на YouTube по этому поводу.
Краткий ответ: используйте,
mock
когда вы проходите мимо того, что хотите высмеять, аpatch
если нет. Из этих двух настоятельно рекомендуется использовать mock, потому что это означает, что вы пишете код с правильной инъекцией зависимостей.Глупый пример:
источник