/ / Funkcje testowania jednostek Pythona za pomocą makiet - python, testowanie jednostkowe, drwiny

Testowanie jednostek Pythona za pomocą mocków - python, testowanie jednostkowe, kpiny

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 № 1

Moż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.