I am trying to get a hang of mocking objects, and seem to by confused by something very basic. I am trying to mock object MyClass and then unit test one of its methods. here is my code:
import mock import unittest class MyClass(object): def __init__(self, a): self.a = a def add_two(self): return self.a + 2 class TestMyClass(unittest.TestCase): @mock.patch('__main__.MyClass') def test_add_two(self, dummy_mock): m_my_class = mock.Mock() m_my_class.a = 10 result = m_my_class.add_two() # I would expect the result to be 12 import ipdb;ipdb.set_trace() self.assert_equal(result, 12) if __name__ == '__main__': unittest.main() In m_my_class.a = 10 I set value of a to to and then in m_my_class.add_two() I add a two, shouldn't I get 12? However, result is:
16 import ipdb;ipdb.set_trace() ---> 17 self.assert_equal(result, 12) 18 ipdb> result <Mock name='mock.add_two()' id='18379792'> What am I missing?
Since I am passing the location of the class via decorator to the test method @mock.patch('__main__.MyClass'), shouldn't mocked have all the methods? Because if not, then why does it matter what class we include in the decorator?
Edit:
When I run this code, I still get the same thing.
class TestMyClass(unittest.TestCase): @mock.patch('__main__.MyClass') def test_add_two(self, dummy_mock): dummy_mock.a = 10 result = dummy_mock.add_two() import ipdb;ipdb.set_trace() self.assert_equal(result, 12) Result:
ipdb> result <MagicMock name='MyClass.add_two()' id='38647312'>