5

Python でモック ライブラリを使用して単体テストを実行しようとしています。次のコードがあります。

def a():
    print 'a'

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

bへの模擬呼び出しが行われたときに、 への呼び出しが行われたことをどのように断言bできますか? 次のコードを試しましたが、失敗しました。

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

どういうわけか、mymock.b()は method とは何の関係もないと思いますb()。これには何ができますか?

4

2 に答える 2

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()
于 2012-04-09T19:40:42.147 に答える
3

どういうわけか、mymock.b() はメソッド b() とは何の関係もないと思います。これに対して何ができるでしょうか?

あなたが正しい。オブジェクトをモックするときは、モックが舞台裏で何をしているのか気にしないことを暗示しています。aが から呼び出されたことを確認したい場合は、 にパッチを適用bする必要があります。 ab

>>> 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

于 2012-04-09T19:43:43.160 に答える