How to Mock a missing attribute

mocking, python

Solution

Actually `mock_class.a` will create another MagicMock, which don't have a spec. The only way I can think of is to assign the attribute `a` of the `mock_class` with another MagicMock with spec, like this:

mock_class = MagicMock(spec=[u'a'])
mock_class.a = MagicMock(spec=[u'a'])
hasattr(mock_class.a, u'c')  # returns False

Also if you have some real objects you want to mock, there is a possibility to do some recursive autospecing.

Problem

I have a line of code that is: ``` if not hasattr(class.a, u'c'): return ``` How do I mock out class so that class.a.c returns False for hasattr? If I do this: ``` >>> from mock import MagicMock >>> mock_class = MagicMock(spec=[u'a']) >>> hasattr(mock_class, u'a') True >>> hasattr(mock_class, u'b') False >>> hasattr(mock_class.a, u'c') True ``` Although I dont spec class.a.c, its being mocked!!!

Original source