Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mocking only a single method on an object

I'm familiar with other mocking libraries in other languages such as Mockito in Java, but Python's mock library confuses the life out of me.

I have the following class which I would like to test.

class MyClassUnderTest(object):      def submethod(self, *args):        do_dangerous_things()      def main_method(self):        self.submethod("Nothing.") 

In my tests, I'd like to make sure that the submethod was called when main_method was executed and that it was called with the right arguments. I don't want submethod to run, as it does dangerous things.

I'm entirely unsure as to how to get started with this. Mock's documentation is incredibly hard to understand and I'm not sure what to even mock or how to mock it.

How can I mock the submethod function, while leaving the functionality in main_method alone?

like image 626
Naftuli Kay Avatar asked Nov 01 '13 23:11

Naftuli Kay


People also ask

How do you mock a method in Jest?

There are two ways to mock functions: Either by creating a mock function to use in test code, or writing a manual mock to override a module dependency.

How can specify the mock Behaviour of an object?

When you create a mock, you create an associated behavior object that controls mock behavior. Use this object to define mock method and property behavior (stub). For more information on creating a mock, see Create Mock Object.


1 Answers

I think what you are looking for is mock.patch.object

with mock.patch.object(MyClassUnderTest, "submethod") as submethod_mocked:     submethod_mocked.return_value = 13     MyClassUnderTest().main_method()     submethod_mocked.assert_called_once_with(user_id, 100, self.context,                                              self.account_type) 

Here is small description

 patch.object(target, attribute, new=DEFAULT,                spec=None, create=False, spec_set=None,                autospec=None, new_callable=None, **kwargs) 

patch the named member (attribute) on an object (target) with a mock object.

like image 80
oleg Avatar answered Oct 04 '22 10:10

oleg