我有這個代碼塊我想單元測試:誰在「不要模擬第三方」和「確保close()被稱爲」之間的戰鬥中獲勝?
@staticmethod
def _read_from_zip(pkg_zip_path):
"""
Return a |BlobCollection| instance loaded from *pkg_zip_path*.
"""
blobs = BlobCollection()
zipf = ZipFile(pkg_zip_path)
for name in zipf.namelist():
blobs[name] = zipf.read(name)
zipf.close()
root_uri = os.path.splitext(pkg_zip_path)[0]
return PhysPkg(blobs, root_uri)
它調用ZipFile中,圖書館/第三方軟件包,所以我想寫一個測試,用ZipFile的整合,而不是嘲笑它(不要模擬第三方代碼規則)。
這是我迄今爲止的測試。 initializer_mock()
是一個輔助功能,在這種情況下,修補的方法__init__()
一類,PhysPkg
:
from opcdiag.phys_pkg import PhysPkg
MINI_PKG_PATH = 'test_files/mini_pkg.zip'
@pytest.fixture
def init(self, request):
return initializer_mock(PhysPkg, request)
def it_can_construct_from_a_zip_package(self, init):
PhysPkg._read_from_zip(MINI_PKG_PATH)
expected_blobs = {'uri_1': b'blob_1\n', 'uri_2': b'blob_2\n'}
init.assert_called_once_with(expected_blobs, ROOT_URI)
的問題是,因爲我不嘲笑ZipFile中,我不知道怎樣才能測試該close()
方法被調用。
也許我應該寫兩個測試?這一個通過測試結果確保與ZipFile的正確集成,另一個通過嘲弄ZipFile來確保close()
被調用?
哦,真棒!我現在意識到我需要做什麼。在Python模擬庫中,存在「[部分嘲諷](http://www.voidspace.org.uk/python/mock/examples.html#partial-mocking)」的概念,它等同於_proxy mock_的概念提到。在閱讀文檔時我曾看到它,但從未嘗試過,直到你提到它纔想起它。在這裏,我敢肯定,這樣做絕對可以做到,並且都可以在一個測試中:)謝謝! – scanny
@scanny很高興能敲響鐘聲。 :-) –