2017-02-17 6 views
0

私はテストで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は、あまりにも少ない数の引数が渡されたときにも検出する必要があります。

+0

私はpython -m unittestファイルを呼び出す予定を変更したときに、私の問題だったpython filename.py – Dan

+0

@sxnを使って実行しました。 – Dan

答えて

1

テストを正しく実行していますか?最初のスニペットのコードをmain.pyファイルに貼り付けて模擬をインストールし、python -m unittest mainを使用して実行し、TypeError: too many positional argumentsを得ました。これはあなたが期待するものです。 :)

1

sxnが指摘したように、私はテストを間違って呼んでいました。私がこのようなテストを呼び出したとき、それは期待通りに機能しました。

$ python -m unittest filename 
+0

クール!それは喜んで:) – sxn

関連する問題