값 비싼 __init__
클래스가 있습니다. 나는이 함수가 테스트에서 호출되는 것을 원하지 않는다. 조롱 된 클래스의 __init__ 실행을 피하십시오
class ClassWithComplexInit(object):
def __init__(self):
raise Exception("COMPLEX!")
def get_value(self):
return 'My value'
내가
ClassWithComplexInit
의 인스턴스를 생성하고이 함수의 사용 번째 클래스가이 실시 예의 목적
, 난
__init__
에 예외가 발생하는 클래스를 만들었다.
class SystemUnderTest(object):
def my_func(self):
foo = ClassWithComplexInit()
return foo.get_value()
SystemUnderTest#my_func()
주위에 단위 테스트를 쓰려고합니다. 내가 겪고있는 문제는 아무리 시도해도 ClassWithComplexInit
일 때 __init__
함수가 항상 실행되고 예외가 발생합니다.
class TestCaseWithoutSetUp(unittest.TestCase):
@mock.patch('mypackage.ClassWithComplexInit.get_value', return_value='test value')
def test_with_patched_function(self, mockFunction):
sut = SystemUnderTest()
result = sut.my_func() # fails, executes ClassWithComplexInit.__init__()
self.assertEqual('test value', result)
@mock.patch('mypackage.ClassWithComplexInit')
def test_with_patched_class(self, mockClass):
mockClass.get_value.return_value = 'test value'
sut = SystemUnderTest()
result = sut.my_func() # seems to not execute ClassWithComplexInit.__init__()
self.assertEqual('test value', result) # still fails
# AssertionError: 'test value' != <MagicMock name='ClassWithComplexInit().get_value()' id='4436402576'>
위의 두 번째 방법은 this similar Q&A에서 가져온 것이지만 작동하지 않습니다. 그것은 함수를 실행하지 않으려면 같았지만 결과는 내 값에 반대 모의 인스턴스가 끝나기 때문에 내 주장은 실패합니다.
는 또한 the docs suggest로start
및
stop
기능을 사용하여
setUp
기능에
patch
인스턴스를 구성했습니다.
는
class TestCaseWithSetUp(unittest.TestCase):
def setUp(self):
self.mockClass = mock.MagicMock()
self.mockClass.get_value.return_value = 'test value'
patcher = mock.patch('mypackage.ClassWithComplexInit', self.mockClass)
patcher.start()
self.addCleanup(patcher.stop)
def test_my_func(self):
sut = SystemUnderTest()
result = sut.my_func() # seems to not execute ClassWithComplexInit.__init__()
self.assertEqual('test value', result) # still fails
# AssertionError: 'test value' != <MagicMock name='mock().get_value()' id='4554658128'>
이것은 또한 내 __init__
기능을 피하기 위해 보이지만 내가 get_value.return_value
설정 값이 존중되지 않는 및 get_value()
여전히 MagicMock
인스턴스를 반환합니다.
테스트중인 코드에 의해 인스턴스화 된 __init__
의 복잡한 클래스를 어떻게 조롱 할 수 있습니까? 이상적으로는 TestCase 클래스 내에서 많은 단위 테스트 (예 : patch
모든 테스트 필요 없음)에서 잘 작동하는 솔루션을 원합니다.
저는 파이썬 버전 2.7.6
을 사용하고 있습니다.
어떻게 테스트 스크립트에서'ClassWithComplexInit'을 사용할 수 있습니까? 'mypackage import ClassWithComplexInit' 또는 다른 것? – chepner
@chepner 제 테스트 스크립트가'ClassWithComplexInit'을 가져 오지 않았습니다. 나는 실제 코드에서 많은 코드를 여기에 게시하여 패키지 참조를 엉망으로 만든다. 참조가 잘못되었다는 것을 알았다.당신은 당신의 대답에 이것을 설명합니다, 고마워요! –