ファイルを読み込み、内容を操作して、内容に応じて値を返す関数をテストしています。機能testme
私はmodule.py
に住んでいます。私はPython 2.7を実行しています。私は私のことができるように(主に文を使用しての繰り返し使用を防止するため、また、動的に様々なREAD_DATAを生成できるように)したいと思い、私はパッチデコレータとside_effectを使用したファイルの読み込み
しかし
import unittest
import module
from mock import patch, mock_open
TestTestMe(unittest.TestCase):
...
def test_test_me(self):
with patch('module.open', mock_open(read_data='1 2')) as _:
self.assertRaises(IndexError, module.testme, 'foo')
with patch('module.open', mock_open(read_data='1 2 3')) as _:
self.assertEquals(module.testme('foo'), 3)
などでこれを達成することができます知っています私のread_dataを関数で定義するデコレータとして@patch
を使ってください。このようなもの。私はクラスの定義とインポートを繰り返さない。
def give_contents(x):
if x == 'correct':
return mock_open(read_data='1 2 3')
else:
return mock_open(read_data='a b c')
、その後のようなテスト機能を使用して:私はこれを回避しようとするが、そのような
TypeError: test_testme() takes exactly 1 argument (2 given)
としてTypeErrorsに実行し続ける
@patch(module.open, side_effect=give_contents)
def test_test_me(self):
self.assertEquals(module.testme('correct'), 3)
。これは私を夢中にさせている。ガイダンスを高く評価します。私が省略したかもしれない詳細をいくつか追加したいのであれば、詳細を尋ねてください。私はそれらを提供します。
編集:要求されたとおりにテストする機能の実装。申し訳ありませんが、これを「重要ではない」として省略したのは明らかです。
def testme(filepath):
with open(filepath, 'r') as f:
line = f.readline().strip().split()
return int(line[2])
あなたが私たちに与えたコードにtest_testme関数が何も含まれていないので、それについてはわかりません。しかし、使用している 'module.testme'メソッドであれば、メソッド定義の文字列パラメータを宣言するのを忘れてしまいました。あなたのフィードバックに応じて、私はこれを答えにするかもしれません。 –
ここで全く嘲笑しないでください。 "ファイル"オブジェクトを引数に変換し、単体テストしていない他のコードを開いてファイルを開く方が良いかもしれません。次に、ある種の文字列IOオブジェクトをスタブとして渡すことができます。たとえ文字列IOで手に入れることができなくても、引き続き引数としてモックを渡すことができます。 (おそらく私が1つを使用してもモックで主張しないだろう) – jpmc26
@Alceste_私は実装を追加しました。あなたが完全な答えを書いたなら、それは素晴らしいでしょう。 – user3274289