2017-12-15 8 views
1

非常に特定の種類の.csvファイルを解析し、そこからフィールドを抽出するcsvパーサモジュールがあります。今、このモジュールをテストするために、私は単体テストを書いています。伝統的には、モジュールをテストするために、私は同じフォーマットのサンプルcsvファイルを作成しましたが、エントリが限られていて、このファイルをモジュールに渡して出力を確認します。明らかに、それはテストファイル自体に依存するのであまり良くありません。csvファイルを模擬する方法

これについては正しい方法はありますか?私はモックモジュールとそれを模擬する方法について読んできました。しかし、私はどのように特定のファイルを模擬することができないのか分かりません。

+1

テストファイルはちょうどいいです。 – xs0

+0

私はそれについてあなたが気になることは非常に不明ですか? – xs0

+0

CSVファイルは「カンマ区切り値」の略で、CSV入力を「hello、world、welcome」のようなカンマ区切りの単純な文字列で置き換えることができます。 – AidanH

答えて

2

あなたはテストデータを提供していないので、ランダムな例があなたの問題に十分に変換されることを願っています。要するに、テスト中に一時的なファイルオブジェクトを作成したくない場合(妥当な制約、imo)は、StringIOを使用します。 mockモジュールにはかなりのエントリハードルがあります。そのために、あなたはその能力を必要としない場合は使用しないでください。

from io import StringIO 
from csv import reader # this should import your custom parser instead 

in_mem_csv = StringIO("""col1,col2,col3 
1,3,foo 
2,5,bar 
-1,7,baz""") # in python 2.7, put a 'u' before the test string 
test_reader = reader(in_mem_csv, delimiter=',', quotechar='|') 
for line in test_reader: 
    print(line) 
    # whatever you need to test to make sure the csv reader works correctly 

出力:

['col1', 'col2', 'col3'] 
['1', '3', 'foo'] 
['2', '5', 'bar'] 
['-1', '7', 'baz'] 

編集:

は、私はちょうど個人的にファイルを表すためにトリプル弦を好むフォーマットする代替文字列には、通常の文字列は、あなたのケースでは良いかもしれません。行を分割して文字列の値を変更しない方法については、この例を参照してください。

in_mem_csv = StringIO(
    "col1,col2,col3\n" 
    "1,3,foo\n" 
    "2,5,bar\n" 
    "-1,7,baz\n" 
) 
+0

ありがとうございます。これは私の要求に完全に合っています。私はこれを試して、それがどうなるか見てみましょう。 – kronosjt

+0

この方法は機能しますが、in_mem_csvを正しく字下げすることはできません。また、csvには19個の列があるため、視覚的に言えば全体が混乱します。 – kronosjt

+0

@kronosjt私は、通常の文字列とそれをどのようにフォーマットすることができるかの例を追加しました。それはもちろん、もっと密に書き上げることもできます。 – Arne