'Mock patch specific instance of class
How to mock a specific instance of a class using patch
?
In my test file I have:
@classmethod
def setUpClass(cls):
cls.instance_of_my_class = myClass()
one of the tests then calls a function in myClass
that I wish to mock the return value of.
I can do so like this.
self.instance_of_my_class.cool_fuction = Mock(return_value=(True, True))
I wish to do this using with patch
so that the mock does not persist into the other tests, or to, in some way unset the mock.
However, patch
requires a string like "package.module.Class.attribute"
as it's target so putting
with patch("self.instance_of_my_class") as mock:
mock.return_value.cool_fuction.return_value = (True, True)
fails with traceback
AssertionError: No module named 'self'
If I patch the class like
with patch("functions_folder.my_script.myClass") as mock:
mock.return_value.cool_fuction.return_value = (True, True)
the wrong instance is patched and mock.called
returns False
The test looks like:
def test_foo_function(self):
result = self.instance_of_my_class.foo_function()
self.assertTrue(result[0]["confirmed"])
and foo_function
calls on cool_function
which I want to mock return (True, True)
Solution 1:[1]
Thanks to @johnsharpe for pointing out the answer.
with the same setUpClass at the start of Test_myClass as I had:
@classmethod
def setUpClass(cls):
cls.instance_of_my_class = myClass()
working test case now looks like:
@patch.object(myClass, "cool_function")
def test_foo_function(self, mock):
mock.return_value = (True, True)
result = self.instance_of_my_class.foo_function()
self.assertTrue(result[0]["confirmed"])
self.assertTrue(mock.called)
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | beautysleep |