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()
0x89? PNGで窒息ですか? –