私はテストで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によれば、autospecは、あまりにも少ない数の引数が渡されたときにも検出する必要があります。
私はpython -m unittestファイルを呼び出す予定を変更したときに、私の問題だったpython filename.py – Dan
@sxnを使って実行しました。 – Dan