Jestem dość nowy w rozwoju Pythona i nie jestem pewien, jaki będzie najlepszy sposób wstrzyknięcia makiet do funkcji testowania jednostkowego.
Mam funkcję, która wygląda tak:
import exampleModule
def func():
ls = createList()
exampleModule.send(ls)
W powyższym kodzie chcę drwić exampleModule.send
metoda.
Czy powinienem przekazać metodę jako argument funkcji? Lubić:
def func(invokeMethod):
ls = createList()
invokeMethod(ls)
W teście jednostkowym mogę przejść próbę. Ale nie chcę, aby wywołujący określił metodę wywołania.
Jak to zrobić?
Odpowiedzi:
2 dla odpowiedzi № 1Możesz użyć drwić biblioteka Michaela Foorda, która jest częścią Pythona 3. Sprawia, że tego rodzaju kpiny są bardzo wygodne. Jednym ze sposobów byłoby:
>>> from mock import patch
>>> import exampleModule
>>>
>>> def func():
... ls = []
... exampleModule.send(ls)
...
>>> with patch("exampleModule.send") as send:
... func()
... assert send.called
Tutaj używamy go jako menedżera kontekstu. Ale ty też używasz patch
jako dekorator. Ale jest więcej sposobów użycia mock
i prawdopodobnie spełni wszystkie twoje potrzeby w szyderstwie / stubbing.
1 dla odpowiedzi nr 2
Python obsługuje funkcje jako obywatele pierwszej klasy, więc możesz zastąpić implementację metody do celów testowania jednostkowego.
To podejście zasadniczo pokazuje drogę.
class Foo
def thing_to_mock():
really_expensive_stuff()
def thing_to_test():
i = 1 + 2
thing_to_mock()
return i
class FooTest
def testingThingToTest():
def mocker():
pass
toTest = Foo()
toTest.thing_to_mock = mocker
# assert here
Alternatywnie w Pythonie 3.3 możesz użyć wbudowane wsparcie szydercze.