jakie kpiny.patch decorator działa w Pythonie

Yuki Nishiwaki

Follow
Feb 23, 2018 · 5 min czytaj

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

  • Jeśli dekorator jest używany dla klasy, to metoda o nazwie zaczynającej się od „test_” tej klasy zostanie udekorowana przez skopiowany dekorator (wewnętrznie wystarczy użyć funkcji dekorator)
  • zachowanie dekoratora funkcji (def decorate_callable) zmieni się w zależności od tego, ile łat używasz dla metody
  • pierwsza dekorator łat zwróci nową wewnętrzną metodę(Def patched), która ma listę „patchings” łącznie z self, ale od drugiej dekoratora łata ta dekoracja łaty tylko doda self to „patchings” list of decorated function and return Original Function.,
  • poprawiona funkcja, która jest zwracana przy pierwszym sprawdzaniu listy „patchings” i próbie zastąpienia wszystkich obiektów na tej liście, ta logika iteracji dla listy „patchings” pozwala użytkownikowi określić wiele Patch decorator.
  • 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”

    Leave a Comment