stanąłem przed problemem wokół Mock.patch i sparametryzowane i sprawdził, jak to działa w ogóle, więc chciałbym napisać tutaj. Ten post wyjaśni, jak mock.,patch dekorować w ogóle i parametryzowane zostaną wyjaśnione w innym poście później.
przede wszystkim pozwól, że napiszę podstawową rzecz dla mocka.patch pisząc prosty test Pythona.
zasadniczo możemy zastąpić obiekt, który jest określony jako pierwszy argument dla „mock.patch ” z instancją MagicMock lub dowolnym obiektem podanym jako drugi argument. Jest to bardzo przydatne, gdy piszesz test jednostkowy, aby kontrolować inne zachowanie modułu, od którego zależy testowany moduł.
jeśli wykonałeś powyższy przykładowy kod, wyjście wygląda następująco
„mock.patch ” wygląda na to, że działa poprawnie, jak widać.,
właściwie jest wiele innych sposobów, jak używać patcha. Np. z „With statement” i z „start method, end method” … ale ten post koncentruje się na wyjaśnieniu użycia dekoratora. Zagrajmy w mocka.patch decorator
funkcja generowania mocka.Patch decorator
zacytował ważny punkt z rzeczywistego kodu źródłowego, a poniżej kod jest faktycznym dekoratorem używanym podczas pisania „@mock.,patch (target)”
zasadniczo ta funkcja wygeneruje funkcję dekoratora z „getter”, która jest funkcją zwracającą rzeczywisty obiekt z atrybutem, który chcesz zastąpić i” atrybut”, który jest nazwą obiektu, który chcesz zastąpić. a następnie wygenerować obiekt „_patch class”, który będzie dekoratorem z nich.
ponieważ prawdopodobnie tłumaczenie tylko tekstem nie jest łatwą rzeczą, więc pozwól mi napisać kod Pythona zrobić to samo, co pierwszy przykład. poniższy kod jest wyciągiem z powyższego przykładowego kodu.,
import os
import [email protected]("os.listdir", mock.MagicMock(return_value="test1"))
def test1():
assert "test1" == os.listdir()
można to napisać w następujący sposób
Jeśli demontujemy więcej, Kod będzie
teraz stało się bardziej jasne, co mock.patch to zrobił, prawda?
ale nadal mamy wielką czarną skrzynkę zwaną „mock.mock._patch „i to był najciekawszy punkt, więc przesuń do przodu, aby spojrzeć na wnętrze” mock.mock._patch”.
dekorator wnętrz (mock.mock._patch)
to wygląda na funkcję, zakładając z nazwy, że nazwa tego wywołanego obiektu nie zaczyna się od wielkiej litery, ale w rzeczywistości jest to klasa do implementacji logiki patch core., Chociaż powiedziałem, że jest wiele sposobów na użycie / wywołanie ” mock.patch”, ich różnice to po prostu sposób wywołania (część frontend) i wszystkie metody ostatecznie używają ” mock.mock._patch ” Klasa do osiągnięcia logiki patcha, więc czytanie tego ma znaczenie, jeśli jesteś zainteresowany poprawką wewnętrzną.
Pokaż kod, ale jedno muszę ci przypomnieć. Edytowałem kod dużo, a jeszcze bardziej kod pokazany stąd nie może być wykonany, więc myśl to jako Python jak pseudo kod. Chciałem, aby było to jak najbardziej proste i łatwe do zrozumienia przez ten pseudo kod., Jeśli chcesz przeczytać aktualny kod, przejdź do github.
dodałem wiele komentarzy, więc chcę, żebyś je przeczytał zanim ruszysz do przodu. Jako uzupełnienie pozwolę sobie wymienić punkty, które chciałbym, aby pan zauważył., obsługa klasy i funkcji
To jest przegląd jak mock.patch zastosowany I jeśli do tej pory rozumiesz, pewnie nie jest trudno poznać więcej szczegółów, takich jak Jak wymienić i rollback…i cokolwiek … po prostu przeczytaj kod, jeśli chcesz.,
na koniec chciałbym napisać skrypt Pythona, który wyjaśnia to, co wyjaśniłem
jest on tworzony na podstawie poprzedniego przykładu. Skrypt służy do sprawdzania, czy funkcja jest zmieniana lub nie przez wbudowaną funkcję „id” i sprawdzania listy funkcji „patchings” jako ostatniego kroku. Zobaczmy więc wynik
jak widać, id test1 było 4506785744 przed nałożeniem łatki, a następnie zmieniono na 4514980040 po nałożeniu łatki po raz pierwszy, ale drugi patch nie zmienił id funkcji, co okazało się, że funkcja nie została zmieniona od czasu nałożenia łatki po raz pierwszy., W ostatnim kroku udowodniono, że funkcja test1 ma wszystkie obiekty łaty, które zastosowałem w 3 krokach.
podsumowanie
używałem mocka i patcha od jakiegoś czasu przy pisaniu testu jednostkowego, ale wcześniej nie czytałem kodu, więc czytanie było bardzo interesujące i dowiedziałem się o pewnych informacjach, których wcześniej nie znałem. dokładniej, jak patch udekorować / zmienić moją oryginalną funkcję jest dobry wgląd podczas pisania kodu.
Następny post będzie znowu wyjaśnieniem jednej z testowych bibliotek Pythona „sparametryzowanych”