当使用太少的参数进行调用时,Autospec 不会失败
Autospec not failing when call is made with too few args
我正在尝试找出在我的测试中使用 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
所以我的问题是哪里做错了?根据 doc 当传递的参数太少时,autospec 也应该 detech。
正如 sxn 指出的那样,我称测试错误。当我这样调用测试时,它按预期工作。
$ python -m unittest filename
您确定您 运行 测试正确吗?我将您的第一个代码段中的代码复制并粘贴到 main.py
文件中,使用 python -m unittest main
安装模拟和 运行 并获得 TypeError: too many positional arguments
,这正是您所期望的。 :)
我正在尝试找出在我的测试中使用 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
所以我的问题是哪里做错了?根据 doc 当传递的参数太少时,autospec 也应该 detech。
正如 sxn 指出的那样,我称测试错误。当我这样调用测试时,它按预期工作。
$ python -m unittest filename
您确定您 运行 测试正确吗?我将您的第一个代码段中的代码复制并粘贴到 main.py
文件中,使用 python -m unittest main
安装模拟和 运行 并获得 TypeError: too many positional arguments
,这正是您所期望的。 :)