Chcę zrozumieć, jak wykonać @patch
funkcję z zaimportowanego modułu.
To jest, gdzie jestem do tej pory.
app / mocking.py:
from app.my_module import get_user_name
def test_method():
return get_user_name()
if __name__ == "__main__":
print "Starting Program..."
test_method()
app / my_module / __ init__.py:
def get_user_name():
return "Unmocked User"
test / mock-test.py:
import unittest
from app.mocking import test_method
def mock_get_user():
return "Mocked This Silly"
@patch('app.my_module.get_user_name')
class MockingTestTestCase(unittest.TestCase):
def test_mock_stubs(self, mock_method):
mock_method.return_value = 'Mocked This Silly')
ret = test_method()
self.assertEqual(ret, 'Mocked This Silly')
if __name__ == '__main__':
unittest.main()
To nie działa tak, jak bym się spodziewał. „Połatany” moduł po prostu zwraca niezakodowaną wartość get_user_name
. Jak pozorować metody z innych pakietów, które importuję do testowanej przestrzeni nazw?
Mock
, która jest zawarta w python3.3 + asunittest.mock
.Odpowiedzi:
Kiedy używasz
patch
dekoratora zunittest.mock
pakietu, nie łatasz przestrzeni nazw, z której moduł jest importowany (w tym przypadkuapp.my_module.get_user_name
), łatasz go w testowanej przestrzeni nazwapp.mocking.get_user_name
.Aby zrobić powyższe,
Mock
spróbuj czegoś takiego jak poniżej:Dokumentacja biblioteki standardowej zawiera przydatną sekcję opisującą to.
źródło
get_user_name
jest w innym module niżtest_method
. Czy istnieje sposób, aby kpić z czegoś w module podrzędnym? Naprawiłem to w brzydki sposób poniżej.get_user_name
znajduje się on w innym module, niżtest_method
ponieważ importujesz do niego funkcjęapp.mocking
, znajdują się one w tej samej przestrzeni nazw.get_user_name_patch
.Chociaż odpowiedź Matti Johna rozwiązuje Twój problem (i mi też pomogła, dzięki!), Sugerowałbym jednak zlokalizowanie zamiany oryginalnej funkcji „get_user_name” na fałszywą. Umożliwi to kontrolowanie, kiedy funkcja zostanie zastąpiona, a kiedy nie. Pozwoli to również na dokonanie kilku wymian w tym samym teście. Aby to zrobić, użyj wyrażenia „with” w całkiem podobny sposób:
źródło
patch
jako dekoratora, czy menedżera kontekstu, zależy od przypadku użycia. Na przykład, możesz użyćpatch
jako dekoratora do kpiny z wartości dla wszystkich testów w klasiexunit
lub,pytest
podczas gdy w innych przypadkach przydatne jest precyzyjne sterowanie zapewniane przez menedżera kontekstu.