单元测试:如何断言同一方法的多个调用?

时间:2013-11-28 16:31:17

标签: python unit-testing python-unittest

我有一个方法,它使用不同的参数调用另一个方法两次。

class A(object):
    def helper(self, arg_one, arg_two):
        """Return something which depends on arguments."""

    def caller(self):
        value_1 = self.helper(foo, bar)  # First call.
        value_2 = self.helper(foo_bar, bar_foo)  # Second call!

使用assert_called_with帮助我断言第一个电话,而不是第二个电话。即使assert_called_once_with似乎没有帮助。我在这里错过了什么?有没有办法测试这样的电话?

2 个答案:

答案 0 :(得分:11)

您可以使用mock_calls,其中包含对方法的所有调用。此列表包含第一个呼叫,第二个呼叫以及所有后续呼叫。因此,您可以使用mock_calls[1]编写断言来陈述关于第二次调用的内容。


例如,如果m = mock.Mock()和代码m.method(123),那么你写:

assert m.method.mock_calls == [mock.call(123)]

断言调用m.method的列表恰好是一个调用,即带参数123的调用。

答案 1 :(得分:1)

要添加到Simon Visser的答案,您可以使用unittest.TestCase self.assertEqual()方法而不是assert语法,我说这是一种更好的做法在单元测试上下文中,因为您还可以添加注释,只要出现问题就会显示。

例如:

self.assertEqual(
    [
        mock.call(1, 'ValueA', True)),
        mock.call(2, 'ValueB', False)),
        mock.call(3, 'ValueC', False))
    ],
    mock_cur.execute.mock_calls,
    "The method was not called with the correct arguments."
)