2012-04-09 12 views
5

私はPythonでモックライブラリを使ってユニットテストをしようとしています。私はbへのモック呼び出しが行われたときbのための呼び出しが行われたことを主張するにはどうすればよいMock pythonを使ってメソッド呼び出しをアサートする

def a(): 
    print 'a' 

def b(): 
    print 'b' 
    if some condition 
     a() 

:私は、次のコードを持っていますか?私は、次のコードを試してみましたが、それは失敗しました:

mymock=Mock() 
mymock.b() 
assertTrue(a.__call__ in mymock.mock_calls) 

何らかの理由で、私はmymock.b()はメソッドb()とは何の関係もないと思います。これには何ができるでしょうか?

答えて

7

あなたがaにパッチを適用した場合、あなたはそれはそうのように呼ばれていたことを確認することができます

with mock.patch('__main__.a') as fake_a: 
    b() 
    fake_a.assert_called_with() 

あなたの方法は、別のモジュール内にある場合:

import mymodule 

with mock.patch('mymodule.a') as fake_a: 
    mymodule.b() 
    fake_a.assert_called_with() 
+0

AttributeErrorを取得しています:__exit__ –

+0

モックモジュールを使用しているのか、モック()を作っていますか?このためには 'import mock'が必要です – Sionide21

+0

モックオブジェクトを作成する –

3

Somehow, I think that the mymock.b() has nothing to do with the method b() What can be done for this?

あなたが正しいです。オブジェクトをモックすると、モックが背後で何をしているのか気にしないことを意味しています。 abから呼び出されたことを確認したい場合は、patchabに設定します。

>>> from mock import patch 
>>> with patch('__main__.a') as patch_a: 
...  b() 
...  patch_a.assert_called_with() 

だから、この話の教訓は、あなたが実際に呼び出さずに測定したい対象物ではなく、その実装あなたが気にオブジェクトの上モックまたはパッチです。この場合、あなたはbに関心があり、どのようにそれがaを使用しているのか調べたいと思う。 aが何をしているのか気にしないので、呼び出されているだけで、パッチを当てることができます。

さらに、assert_called_withの代わりにmock_callsというパッチにアクセスして行われたすべてのコールを分析できます。この場合、patch_a.mock_callsとなります。

+0

として、私はパッチを試してみましたmock.patchと (「xyz.abc.a」):私はこれを試してみましたXYZインポートABC から :私はこのようなインポートを持っています。私はまだ属性のエラーを受け取ります –

+0

私はあなたが上に投稿したものとこのコードを使用しました(唯一の違いは 'いくつかの条件'を 'True:'で置き換えたことです)。それは間違いなく走った。エラーが発生した場合は、**あなたの質問を**編集して、問題とスタックトレースを与える実際のコードを投稿してください。その情報がなければ、トラブルシューティングに役立つものは何もできません。 – Wilduck

関連する問題