2017-02-17 3 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 автоспец должен также обнаруживать, когда передано слишком мало аргументов.

+0

Я просто запустил его с помощью python filename.py – Dan

+0

@sxn, это была моя проблема, когда я изменил вызов python -m unittest filename, он работал как ожидалось. – Dan

ответ

1

Вы уверены, что используете данный тест правильно? Я копирую + вставлял код из вашего первого фрагмента в файл main.py, устанавливал макет и запускал его с помощью python -m unittest main и получил TypeError: too many positional arguments, что и следовало ожидать. :)

1

Как указано в sxn, я неправильно назвал тест. Когда я назвал этот тест, он работал, как ожидалось.

$ python -m unittest filename 
+0

Прохладный! Рад, что это помогло :) – sxn