这个简单的`unittest.mock`用例出了什么问题?

时间:2017-02-13 19:55:26

标签: python-3.4 python-3.5 pytest python-unittest

编辑:这可能与此Python错误中描述的问题相同:https://bugs.python.org/issue26752。但是这个bug已经存在了一年,所以我仍然对这里的人们的意见感兴趣。

我不确定这是unittest.mock中的错误还是我误解了什么。

以下是代码 - 您可以将其另存为test.py

from unittest.mock import patch, call

class Foo:
    def __init__(self):
        pass
    def my_method(self, value):
        pass

def test_foo():
    with patch('test.Foo', autospec=True) as MockFoo:
        m = Foo()
        m.my_method(123)
        MockFoo.assert_has_calls([call(), call().my_method(123)])

我像这样运行这个测试:

$ py.test test.py

我失败了:

...
E               AssertionError: Calls not found.
E               Expected: [call(), call().my_method(123)]
E               Actual:   [call(), call().my_method(123)]

问题:这是正确的行为吗?这对我来说似乎有些不对劲。 调用列表完全匹配,所以给出了什么?

有趣的是,如果我删除了value的{​​{1}}参数以及测试中的my_method输入,那么一切都会过去!

我在这里错过了什么?

版本信息:

123

还在3.5版的virtualenv中试过这个:

$ py.test --version
This is pytest version 3.0.6, imported from /usr/local/lib/python3.4/site-packages/pytest.py
$python3.4 --version
Python 3.4.5

1 个答案:

答案 0 :(得分:1)

编辑:删除错误的先前答案。

请你试试:

expected_calls = [call(), call().my_method(123)]
assert MockFoo.mock_calls == expected_calls

这适用于Python 3.5.2。

这可以直接从文档中获取:https://docs.python.org/3/library/unittest.mock.html#unittest.mock.Mock.mock_calls