2

単体テストしたい次のコードブロックがあります。

@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 をモックするのではなく、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)

close()問題は、私は ZipFile をモックしていないため、メソッドが呼び出されることをテストする方法がわからないことです。

多分私は2つのテストを書くべきですか?これは結果をテストすることで ZipFile との適切な統合を保証するもので、もう 1 つは ZipFile をモックして確実close()に呼び出されるようにするものですか?

4

1 に答える 1

1

はい、2 つのテストを作成する必要があります。closeまたは、すべてのメソッドを転送するライブラリへのプロキシを作成できますが、呼び出された回数をカウントします。

理由proxyの代わりにその言葉を使用しました。mockあなたはそれを置き換えていません(モックオブジェクトが通常行うように)。透明なレイヤーを追加しているだけです。

「サードパーティのライブラリをモックしない」理由は、それらをテストする必要があるためです (特に、それらを更新する場合、または更新する可能性がある場合)。代替手段の 1 つは、プロバイダーを信頼することです。もう 1 つは、完全なテストを作成することです。そして 3 つ目 (そう、「サード パーティのライブラリをモックしないでください」によって促進されたもの) は、ソフトウェアがそれらを効果的に使用する側面でのみテストすることです。Aproxy mockはこれを変更しません。

于 2013-09-01T06:55:35.960 に答える