だから私はこのクラスのテストを書いています(より明確にするために編集されています):
class SpreadSheet(object):
'''awesome docstring'''
def __init__(self, filename):
self.filename = filename
self.table = []
self.headers = []
with open(self.filename) as csvfile:
filereader = reader(csvfile, delimiter=',')
for row in filereader:
self.table.append(row)
def create_headers(self, populations):
...code...
def lookup_header(self, ltr):
...code...
def write_header(self, targetfile):
...code...
これまでのところ、次のようになります。
class TestSpreadSheet(unittest.TestCase):
@contextmanager
def make_fake_csv(self, data):
self.fake_namefile = tempfile.NamedTemporaryFile(delete=False)
with open(self.fake_namefile, 'w') as fake_csv:
fake_writer = csv.writer(fake_csv)
fake_writer.writerows(data)
yield self.fake_namefile.name
os.unlink(self.fake_namefile.name)
def setUp(self):
self.headers = []
self.table = [
['Col1', 'Col2', 'Col3', 'Col4', 'Col5', 'Col6', 'Col7', 'Col8'],
['val1', 'val2', 'val3', 'val4', 'val5', 'val6', 'val7', 'val8'],
['val1', 'val2', 'val3', 'val4', 'val5', 'val6', 'val7', 'val8'],
['val1', 'val2', 'val3', 'val4', 'val5', 'val6', 'val7', 'val8']]
def test___init__(self):
with self.make_fake_csv(self.table) as temp_csv:
spread_sheet = SpreadSheet(temp_csv)
self.assertEqual(
self.table, spread_sheet.table)
...tests for other functions...
そして、私はこのエラーを受け取ります:
in make_fake_csv
with open(self.fake_namefile, 'w') as fake_csv:
TypeError: coercing to Unicode: need string or buffer, instance found
tempfile
を使用して名前付きオブジェクトを作成したり、 を使用して実際に呼び出すことができるものを作成したりすることを示す、このような他の多くのトピックを精査しましたwith open...
。そして、私は実際にそれを機能させましたが、私の問題は、csv
パッケージを使用しself.table
て自分をcsv形式の生の「文字列」(つまり、csvファイルの生の入力など)にフォーマットしようとしたときでした。
これを別の方法でテストしたり、現在のコードを機能させる方法についての指針はありますか? 繰り返しますが、私はしようとしています:
巨大な文字列の書式設定式を作成する必要がないように、
csv
自分から偽のcsvファイルをロードするためにすべての書式設定の面倒な作業を行う方法を理解してくださいself.table
テストの実行時に
with open
、元のクラスで使用されているように偽のファイルが機能することを確認してくださいSpreadSheet
SpreadSheet
関数を実行するためにファイルでインスタンス化する必要があるため、他の関数のテストを実行するためにさらに使用できます。
そして、副次的な質問として、このようなことを行うために偽の「メモリ」ファイルを作成する方が「無駄のない」ものですか(これは私が上で試みていることです)、またはディスク上に実際の一時ファイルを作成してロードする方が簡単ですテスト中にアップし、tearDown()
関数を使用して削除しますか?