1

出力に連結された後に各ファイルを削除して、順次連結する必要があるファイルがたくさんあるユースケースがあります。コードは次のようになります。

def compile(self):
    with open("output.file", "wb") as outfile:
        for part in sorted(self.parts):
            with open(part, "rb") as infile:
                for line in infile:
                    outfile.write(line)

            os.remove(part)

    # do other logic ...

このコードを適切にテストする方法を思いつくのに苦労しています。私はそれを確立したい:

  1. パーツはソートされ、ソートされた順序でループされます。
  2. 各入力ファイルは 1 行ずつ読み取られ、出力ファイルに書き込まれます。
  3. 各入力ファイルは使い果たされた後に削除されます。

私の主な問題は、ファイル オブジェクトをモックすることです。Python のmockライブラリを使用していますが、どこにパッチを当て、どのようにパッチを適用すればよいかわかりません。ファイル オブジェクトにパッチを適用して、すべてが適切に書き込まれたことを確認するにはどうすればよいですか?

4

1 に答える 1

1

「open」、「os.remove」、「sorted」が実際に機能していることを実際にテストする必要はありません。これらは Python 標準ライブラリの一部であるため、他の場所で十分にテストされていると想定しても安全です。本当に必要なのは、それらが実際に呼び出されることをテストすることだけなので、テスト コードでこれらの呼び出しを単純にモックし、期待する引数で実際に呼び出されることをテストできます。

テストは次のようなものになる可能性があります

@mock.patch.object(os, 'remove')
@mock.patch('%s.sorted' % __name__, create=True)
@mock.patch('%s.open' % __name__, create=True)
def test_compile(mock_open, mock_sort, mock_os_remove):
    mock_sort.return_value = ['parts']
    compile()
    mock_open.assert_any_call('output.file', 'wb')
    mock_sorted.assert_called_with(['parts'])
    mock_os_remove.assert_called_with('parts','rb')

compile() はスタンドアロン関数ではなくメソッドのように見えるため、明らかにこれを少し調整する必要がありますが、パッチと関数への一般的なアプローチは同じにする必要があります。

于 2013-11-14T21:41:42.927 に答える