[openstack-dev] [cinder] How to make a mock effactive for all method of a testclass

Eric Harney eharney at redhat.com
Wed Sep 23 14:40:54 UTC 2015


On 09/23/2015 04:06 AM, liuxinguo wrote:
> Hi,
> 
> In a.py we have a function:
> def _change_file_mode(filepath):
> utils.execute('chmod', '600', filepath, run_as_root=True)
> 
> In test_xxx.py, there is a testclass:
> class xxxxDriverTestCase(test.TestCase):
> def test_a(self)
>     ...
>     Call a. _change_file_mode
> ...
> 
> def test_b(self)
>     ...
>     Call a. _change_file_mode
> ...
> 
> I have tried to mock like mock out function _change_file_mode like this:
> @mock.patch.object(a, '_change_file_mode', return_value=None)
> class xxxxDriverTestCase(test.TestCase):
> def test_a(self)
>     ...
>     Call a. _change_file_mode
> ...
> 
> def test_b(self)
>     ...
>     Call a. _change_file_mode
> ...
> 
> But the mock takes no effort, the real function _change_file_mode is still executed.
> So how to make a mock effactive for all method of a testclass?
> Thanks for any input!
> 
> Wilson Liu

The simplest way I found to do this was to use mock.patch in the test
class's setUp() method, and tear it down again in tearDown().

There may be cleaner ways to do this with tools in oslotest etc. (I'm
not sure), but this is fairly straightforward.

See here -- self._clear_patch stores the mock:
http://git.openstack.org/cgit/openstack/cinder/tree/cinder/tests/unit/test_volume.py?id=8de60a8b#n257




More information about the OpenStack-dev mailing list