python - Avoid executing __init__ of mocked class -



python - Avoid executing __init__ of mocked class -

i have class expensive __init__ function. don't want function called tests.

for purpose of example, made class raises exception in __init__:

class classwithcomplexinit(object): def __init__(self): raise exception("complex!") def get_value(self): homecoming 'my value'

i have sec class constructs instance of classwithcomplexinit , uses it's function.

class systemundertest(object): def my_func(self): foo = classwithcomplexinit() homecoming foo.get_value()

i trying write unit tests around systemundertest#my_func(). problem having no matter how seek mock classwithcomplexinit, __init__ function gets executed , exception raised.

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 not execute classwithcomplexinit.__init__() self.assertequal('test value', result) # still fails # assertionerror: 'test value' != <magicmock name='classwithcomplexinit().get_value()' id='4436402576'>

the sec approach above 1 got this similar q&a didn't work either. seemed not run __init__ function assertion fails because result ends beingness mock instance opposed value.

i tried configure patch instance in setup function, using start , stop functions the docs suggest.

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 not execute classwithcomplexinit.__init__() self.assertequal('test value', result) # still fails # assertionerror: 'test value' != <magicmock name='mock().get_value()' id='4554658128'>

this seems avoid __init__ function value set get_value.return_value isn't beingness respected , get_value() still returning magicmock instance.

how can mock class complicated __init__ instantiated code under test? ideally, solution works many unit tests within testcase class (e.g. not needing patch every test).

i using python version 2.7.6.

first, need utilize same name patching create foo, is,

class systemundertest(object): def my_func(self): foo = mypackage.classwithcomplexinit() homecoming foo.get_value()

second, need configure right mock object. configuring classwithcomplexinit.get_value, unbound method, need configure classwithcomplexinit.return_value.get_value, mock object called foo.get_value().

@mock.patch('mypackage.classwithcomplexinit') def test_with_patched_class(self, mockclass): mockclass.return_value.get_value.return_value = 'test value' sut = systemundertest() result = sut.my_func() # seems not execute classwithcomplexinit.__init__() self.assertequal('test value', result) # still fails

python python-2.7 mocking python-unittest python-mock

Comments

Popular posts from this blog

Delphi change the assembly code of a running process -

json - Hibernate and Jackson (java.lang.IllegalStateException: Cannot call sendError() after the response has been committed) -

C++ 11 "class" keyword -