0

我正在尝试找出在测试中使用 autospec 的最佳方法。在以下场景中,我使用 autospec 来检测何时使用太多参数进行调用。使用 调用时,此方案按预期工作$ 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()

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

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

所以我的问题是做错了什么?根据文档autospec 也应该在传递的参数太少时取消技术。

4

2 回答 2

1

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

$ python -m unittest filename
于 2017-02-17T22:18:21.713 回答
1

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

于 2017-02-17T22:23:31.677 回答