2017-12-01 11 views
0

私はこのコードをテストしようとしている:ZipFileコンストラクタをどうやってモックできますか?

提供されたファイルの名前に CLASSESが含まれている場合には、どのような私のために重要である
def read_classes(file): 
    if CLASSES in file: 
     classes = open(file, "rb").read() 
    else: 
     with ZipFile(file, "r") as archive: 
      classes = archive.read(CLASSES) 
    return classes 

openが呼び出されます、そうでない場合は、ZipFileが使用されます。しかし、私がすでにテストした最初の部分は、ZipFileを模倣して、嘲笑されたオブジェクト(archive)を返すことができません。readというメソッドが呼び出されています。

@patch('zipfile.ZipFile') 
def test_givenFile_whenReadClasses_expectArchiveCalled(self, mock_zipfile): 
    file = 'sample.file' 
    archive = Mock() 
    mock_zipfile.return_value = archive 

    read_classes(file) 

    archive.read.assert_called_once_with("classes.file") 

を、私はそれが私に与えて、オリジナルのZipFileコンストラクタを実行し続け、それを行うとき: IOError: [Errno 2] No such file or directory: 'sample.file'

+0

正直な質問:なぜ気になるのですか?その機能は簡単ではありません。テストする必要がある場合は、プロジェクトにファイルのペアをチェックインし、それぞれを開き、比較するテストを作成します。 1つは圧縮されたファイルになり、1つはプレーンなファイルになります。 –

+0

ハム、これは可能であることは分かっていましたが、将来もっと複雑なコードで自分自身を見たらどうなりますか?それを正しく模倣する方法がなければならないのですか? –

答えて

0

ストレートポイントに:これは私がこれまでにしようとしてきたものです

@patch('zipfile.ZipFile') 
def test_givenFile_whenReadClasses_expectArchiveCalled(self, mocked_zip_file): 
    file = 'file' 
    archive = Mock() 
    mocked_read = Mock() 
    archive.return_value.read = mocked_read 
    mocked_zip_file.return_value.__enter__ = archive 

    read_classes(dex_file) 

    mocked_read.assert_called_once_with('another_file') 
関連する問題