Я пытаюсь выяснить, как использовать autospec в моих тестах. В следующем сценарии я использую autospec для обнаружения, когда вызов выполняется со слишком большим количеством аргументов. Этот сценарий работает как ожидается при вызове с $ python filename.py
.Autospec не работает, когда вызов выполняется с слишком небольшим количеством аргументов
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 автоспец должен также обнаруживать, когда передано слишком мало аргументов.
Я просто запустил его с помощью python filename.py – Dan
@sxn, это была моя проблема, когда я изменил вызов python -m unittest filename, он работал как ожидалось. – Dan