Używam makiety w Pythonie i zastanawiałem się, które z tych dwóch podejść jest lepsze (czytaj: bardziej pythonowe).
Metoda pierwsza : po prostu utwórz pozorowany obiekt i użyj go. Kod wygląda następująco:
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)
Metoda druga : użyj łatki, aby utworzyć makietę. Kod wygląda następująco:
@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)
Obie metody robią to samo. Nie jestem pewien różnic.
Czy ktoś mógłby mnie oświecić?
python
unit-testing
mocking
Sardathrion - przeciwko nadużyciom SE
źródło
źródło
Odpowiedzi:
mock.patch
jest zupełnie innym stworzeniem niżmock.Mock
.patch
zamienia klasę na obiekt pozorowany i umożliwia pracę z instancją pozorowaną. Spójrz na ten fragment:patch
zastępujeMyClass
w sposób, który pozwala kontrolować użycie klasy w wywoływanych funkcjach. Po załataniu klasy odwołania do klasy są całkowicie zastępowane przez pozorowaną instancję.mock.patch
jest zwykle używany podczas testowania czegoś, co tworzy nową instancję klasy w teście.mock.Mock
wystąpienia są bardziej przejrzyste i preferowane. Jeśli twojaself.sut.something
metoda utworzyła instancjęMyClass
zamiast odbierania instancji jako parametru,mock.patch
byłoby to odpowiednie tutaj.źródło
Mam na ten temat film z YouTube .
Krótka odpowiedź: używaj,
mock
gdy mijasz rzecz, z której chcesz się wyśmiać, apatch
jeśli nie. Spośród tych dwóch zdecydowanie preferowany jest mock, ponieważ oznacza to, że piszesz kod z odpowiednim wstrzyknięciem zależności.Głupi przykład:
źródło