Saya ingin memahami bagaimana @patch
suatu fungsi dari modul yang diimpor.
Di sinilah saya sejauh ini.
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()
Ini tidak bekerja seperti yang saya harapkan. Modul "patched" hanya mengembalikan nilai unmocked dari get_user_name
. Bagaimana cara meniru metode dari paket lain yang saya impor ke namespace yang sedang diuji?
python
unit-testing
python-unittest
python-mock
nsfyn55.dll
sumber
sumber
Mock
, yang termasuk dalam python3.3 + asunittest.mock
.Jawaban:
Saat Anda menggunakan
patch
dekorator dariunittest.mock
paket, Anda tidak menambal namespace tempat modul diimpor (dalam hal iniapp.my_module.get_user_name
) Anda menambalnya di namespace yang diujiapp.mocking.get_user_name
.Untuk melakukan hal di atas dengan
Mock
mencoba sesuatu seperti di bawah ini:Dokumentasi pustaka standar menyertakan bagian berguna yang menjelaskan hal ini.
sumber
get_user_name
berada dalam modul yang berbeda daritest_method
. Apakah ada cara untuk mengejek sesuatu di sub_module? Saya memperbaikinya dengan cara yang buruk di bawah ini.get_user_name
ada di modul yang berbeda daripadatest_method
karena Anda mengimpor fungsi ke dalamnyaapp.mocking
di namespace yang sama.get_user_name_patch
.Sementara jawaban Matti John memecahkan masalah Anda (dan membantu saya juga, terima kasih!), Namun saya akan menyarankan untuk melokalkan penggantian fungsi 'get_user_name' yang asli dengan fungsi tiruan. Ini akan memungkinkan Anda untuk mengontrol kapan fungsi diganti dan kapan tidak. Selain itu, ini memungkinkan Anda membuat beberapa penggantian dalam pengujian yang sama. Untuk melakukannya, gunakan pernyataan 'with' dengan cara yang cukup mirip:
sumber
patch
sebagai dekorator atau pengelola konteks khusus untuk kasus penggunaan. Misalnya, Anda dapat menggunakanpatch
sebagai dekorator untuk mengejek nilai untuk semua pengujian di kelasxunit
ataupytest
sementara dalam kasus lain akan berguna untuk memiliki kontrol terperinci yang diberikan oleh pengelola konteks.