2016-12-19 11 views
3

io.StringIO(または同等のもの)を無効なUTF-8文字列で初期化することは可能ですか?readlines()を呼び出すと失敗しますか?私はこれが奇妙な要求だと知っていますが、単体テストで失敗モードを再現しようとしています。無効なユニコードで `io.StringIO`を初期化すると` .readlines`が失敗します?

現在、私はテキストファイルを読み込もうとしていて、誤ってバイナリファイルを取得しようとしています。私のコードは、私がテストケースでこれを再現したいとして、(UnicodeDecodeErrorをキャッチして、ファイルが無効であることを報告し)これを修正するだろう

builtins.UnicodeDecodeError: 'utf-8' codec can't decode byte 0x89 in position 0: invalid start byte

でクラッシュ。しかし、私はテストケースの中に無効なファイルのコピーを保持したくありません。私はそれが私の無効なFileインスタンスのように振る舞うファイルのようなオブジェクトを作成することが可能でなければならないと思う。

私は

f = io.BytesIO(b'\x89') 
myfunction(f) 

を試みたが、それはF戻っbytesオブジェクトから読み込むため、動作しません。 str(ユニコード)を返そうとするものが必要です。

f = io.StringIO('\x89') 
myfunction(f) 

のようなものを使用することはできません。これは、myfunctionを呼び出す前に既に失敗しているためです。何か案は?


私の現在の回避策は次のとおりです。

import listingparser 
import unittest 
import io 

class ListingParserTestCase(unittest.TestCase): 
    def test_invalid_input(self): 
     """ Invalid file contents should cause ParseError, not UnicodeDecodeError. """ 
     with open('test-temp.dat', 'wb') as f: 
      f.write(b'\x89') 
     with open('test-temp.dat', 'r') as invalid_file: 
      with self.assertRaises(listingparser.ParseError): 
       listingparser.parsef(invalid_file) 

が、私は同じことをしたいのですが - ブービートラップされinvalid_fileオブジェクトを作成する - 一時ファイルなし。以下は:-)カウントされません、私はそれがparsefの内部についてはあまり知っている必要があると感じ:

class MockFile(object): 
    def readlines(self): 
     raise ParseError() 
+0

0x89? PNGで窒息ですか? –

答えて

0

However, I don't want to keep a copy of the invalid file among my test cases.

なぜいけないのでしょうか?テストケースです。

>>> import codecs,io 
>>> f=codecs.EncodedFile(io.BytesIO(b'\x89'), 'utf-8') 
>>> f.readlines() 
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x89 in position 0: invalid start byte 
関連する問題