当使用太少的args进行调用时,Autospec不会失败

时间:2017-02-17 21:25:20

标签: python-2.7 python-unittest python-unittest.mock

我正在尝试找出在我的测试中使用autospec的最佳方法。在下面的场景中,我使用autospec来检测何时使用过多的args进行调用。使用$ python filename.py调用时,此方案按预期工作。

import unittest
import mock

class FakeDependency(object):
    def set_obj(arg1, arg2):
        self.foo = arg1
        self.bar = arg2


class FakeObject(object):
    def __init__(self):
        self.fake_dependency = FakeDependency()

    def set_dependency(self):
        self.fake_dependency.set_obj('foo', 'bar', 'buz')  # Bug


class TestFakeObject(unittest.TestCase):

    @mock.patch.object(FakeDependency, 'set_obj')
    def test_set_dependency_with_assert_called(self, mock_dependency):
        r = FakeObject()
        r.set_dependency()
        mock_dependency.assert_called_once_with('foo', 'bar', 'buz')  # Test passes does not catch bug


    @mock.patch.object(FakeDependency, 'set_obj', autospec=True)
    def test_set_dependency_with_autospec(self, mock_dependency):
        r = FakeObject()
        r.set_dependency()  # Test Fails


if __name__ == '__main__':
    unittest.main()

但是,如果我更改测试用例以检测何时调用的args太少,那么它会通过并且不会捕获错误。

class FakeDependency(object):
    def set_obj(arg1, arg2, arg3):
        self.foo = arg1
        self.bar = arg2
        self.buz = arg3


class FakeObject(object):
    def __init__(self):
        self.fake_dependency = FakeDependency()

    def set_dependency(self):
        self.fake_dependency.set_obj('foo', 'bar')  # Bug


class TestFakeObject(unittest.TestCase):

    @mock.patch.object(FakeDependency, 'set_obj')
    def test_set_dependency_with_assert_called(self, mock_dependency):
        r = FakeObject()
        r.set_dependency()
        mock_dependency.assert_called_once_with('foo', 'bar')  # Test passes does not catch bug


    @mock.patch.object(FakeDependency, 'set_obj', autospec=True)
    def test_set_dependency_with_autospec(self, mock_dependency):
        r = FakeObject()
        r.set_dependency()  # Test Also passes

所以我的问题是做错了什么?根据{{​​3}} autospec,当传递的args太少时也应该检测到。

2 个答案:

答案 0 :(得分:1)

正如sxn指出的那样,我把测试称错了。当我像这样调用测试时,它按预期工作。

$ python -m unittest filename

答案 1 :(得分:1)

您确定正确运行测试吗?我将第一个代码段中的代码复制+粘贴到main.py文件中,安装了mock并使用python -m unittest main运行并得到TypeError: too many positional arguments,这是您所期望的。 :)