2012-02-19 9 views
6

のモック:How do I mock an open used in a with statement (using the Mock framework in Python)?Pythonのモック - これを読んだ後、いくつかのオープン

は、私が使用してPythonでオープン機能を模擬することができるよ:私のテスト方法は、1つのopen文を使用する場合

with patch(open_name, create=True) as mock_open: 
    mock_open.return_value = MagicMock(spec=file) 
    m_file = mock_open.return_value.__enter__.return_value 
    m_file.read.return_value = 'text1' 

    diffman = Diffman() 
    diffman.diff(path1, path2) 

それはうまく動作します。

def diff(self, a, b): 
    with open(a, 'r') as old: 
     with open(b, 'r') as new: 
      oldtext = old.read() 
      newtext = new.read() 

oldtextとをnewTextの値が同じ(ここでは「テキスト1」)、次のとおりです。ここに私のテスト方法です。

私はoldtextに 'text1'、newtextに 'text2'を持っています。

どうすればいいですか?

答えて

5

ここでは、あなたが望むものを得るための簡単な方法があります。テスト中のメソッド内の2つのファイルオブジェクトが同じオブジェクトであり、読み込み後に読み込み呼び出しの戻り値を変更しているだけなので、ちょっと騙されます。ファイルオブジェクトを異なるものにしたい場合、同じテクニックを複数のレイヤーで使用することはできますが、非常に面倒でテストの目的を不必要に変える可能性があります。おそらく、良い可能な解決策がちょうど良く簡単にそれをテストするために自分自身を貸す方法でコードを書くことです

 
    reads = ['text1', 'text2'] 
    m_file.read.side_effect = lambda: reads.pop(0) 
3

:で

 
    m_file.read.return_value = 'text1' 

は、この行を置き換えます。 'diff'の場合は、すでにオープンされているファイルオブジェクトを引数としてdiffを取るだけで十分です(他のコンテキストはあまりありません)。これは、コード内で行う小さな変更である可能性が高く、テストを非常に簡単に行うことができます。これは、テスト時にdiff()にモックファイルオブジェクトを簡単に提供できるためです。 ...内で呼び出されたコンテキストマネージャとしての組み込み関数...または何か;-)

import StringIO 

diff(a, b): 
    oldtext = a.read() 
    newtext = b.read() 

def test_diff(): 
    a = StringIO.StringIO('text1') 
    b = StringIO.StringIO('text2') 

    res = diff(a, b) 
    <some assertion here> 

あなたのケースでは機能しますか?

関連する問題