5

mockライブラリでPythonのテストを書いていると、 「どの引数でメソッドが呼び出されているか」というのがよく出てくるのですが、

from __future__ import print_function
import mock

m = mock.MagicMock(side_effect=lambda x: x * x)
m(4)
print("m called with: ", m.call_args_list)

(これは印刷されますm called with: [call(4)])。質問: 戻り値 (この場合は16) を取得する方法はありますか?

詳細: 私の特定のシナリオでは、side_effect を使用してサブモック オブジェクトを返したいと考えています。そのオブジェクトをイントロスペクトして、何が呼び出されているかを確認することが重要です。たとえば、「実際のコード」(非テスト コード) は次のように記述します。

myobj = m(4)
myobj.foo()

を使用するside_effectと、新しいサブモック オブジェクトを返す便利な方法のように思えますが、keep around も使用できますcall_args_listMagicMockただし、関数からの戻り値を格納しているようには見えませんside_effect...私は間違っていますか?

4

5 に答える 5

1

あなたが私に尋ねるなら、これはモックが意図しているものではありません。戻り値をアサートしたい場合は、関数を直接呼び出す必要があります。関数が返すものを登録するためにフープを介してジャンプする必要がある場合は、設計に欠陥がある可能性が高くなります。

たとえば、内部関数がある場合、内部関数をテストしないでください。内部関数をテストする場合は、パブリックにアクセスできるようにします。

したがって、これの代わりに:

def spam(input):
    def eggs(nested):
        return nested*2
    input = eggs(nested)
    return eggs(input)

これを行う:

def eggs(nested):
    return nested*2

def spam(input):
    input = eggs(nested)
    return eggs(input)
于 2014-02-11T19:15:35.883 に答える
0

を使用しreturn_valueます。

例えば、

import unittest

import mock

def foo(m):
    myobj = m(4)
    myobj.foo()

import unittest

class TestFoo(unittest.TestCase):
    def test_foo(self):
        m2 = mock.MagicMock()
        m = mock.MagicMock(return_value=m2)

        foo(m)

        m.assert_called_once_with(4)
        m2.foo.assert_called_once_with()

if __name__ == '__main__':
    unittest.main()
于 2013-08-03T04:49:44.027 に答える
0

は必要ありませんside_effect。これは、モックがそれなしで既に行っていることです。それらは他のモックを返します。

あなたはそれを行うことによってそれらについてアサーションを行いますmymock.return_value.assert_called_once_with(4)

もしそうなら、他の場所からの参照を持っていたモックを返すだけですside_effect

于 2013-08-02T23:40:21.377 に答える