4

moxの記録/再生/検証パターンの 代わりにunittest.mockのアクション/アサート パターンの使用を開始しようとしています。

# foo.py
def op_1(param):
    pass

def op_2(param):
    pass

def do_stuff(param_1, param_2):
    global config
    global log
    try:
        op_1(param_1)
        if config.getboolean('section','option'):
            op_2(param_2)
    except:
         log.error("an error occured")

そして、これが私の unittest ファイルの例です。

# test_foo.py
class TestFoo(unittest.TestCase):
    def test_do_stuff(self):
        param_1 = None
        param_2 = None
        foo.config = MagicMock()
        foo.config.getboolean('section','option', return_value = True)
        foo.op_1 = MagicMock()
        foo.op_2 = MagicMock()
        do_stuff(param_1, param_2)
        foo.op_1.assert_called_once_with(param_1)
        foo.op_2.assert_called_once_with(param_2)
        foo.config.getboolean.assert_called_once_with('section','option')

このテストは、以下の項目を検証するためのものですか?/私はモックを正しく使用していますか?

  1. エラーなしで返された do_stuff 呼び出し
  2. op_1 は param_1 で呼び出されました
  3. op_2 は param_2 で呼び出されました
  4. config パーサー オブジェクトが使用されていましたが、特定の呼び出しは問題ではありません
4

1 に答える 1

3

return_value使い方が間違っていた ことが判明。

mock.Mockまたはオブジェクトが値を返す必要mock.MagicMockがある場合、渡された引数に関係なく、常にその値を返す必要があります。ただし、渡された引数に基づいて異なる動作を与えると便利な場合があります (機能要求の可能性があります)。

私がこれを完成させた方法は次のとおりです。

foo.config.getboolean = mock.MagicMock(return_value = True)

そして、私はこれを行うことができます:

self.assertGreaterThan(len(foo.config.mock_calls), 0)
self.assertGreaterThan(len(foo.config.getboolean(str(),str())), 0)
于 2012-12-30T17:29:37.567 に答える