autospec
00:00
Another way you can do this is by using create_autospec. So if we say from unittest.mock import create_autospec, we can say calendar = create_autospec() of my_calendar.
00:23
I misspelled it again. And then if we look at calendar, it’s going to be a NonCallableMagicMock. This is kind of outside the scope of this course, but essentially it’s a Mock object, and its spec is coming from the module my_calendar.
00:44
If we look at the dir() of calendar, again, we’ll see 'is_weekday', 'get_holidays', 'requests'—all these things that are coming from the my_calendar module.
00:55
And we can do the same thing, calendar.is_weekday(),
01:02
and then try to misspell it, and we get an AttributeError. And the cool thing about autospec is that we can actually use that in our patch() function, whether as a decorator or a context manager.
01:16 Let me show you what that looks like.
01:20
We can say with patch(), and since we’re in the same directory as my_calendar, you can just say '__main__.my_calendar' and then pass in this autospec parameter and set it to True.
01:41
So what that’s going to do is create a specification that is the interface of my_calendar as the Mock object, so we’ll have the same interface and avoid those typos and misspellings—those common errors that come up. And then we say as calendar: and we can say calendar.is_weekday(), so that should be fine.
02:07
Let’s try one that doesn’t exist, so calendar.is_a_holiday_foo()—something that I know doesn’t exist. So when we execute this—well, ha, we haven’t imported patch().
02:24
So from unittest.mock import patch, and let’s go ahead and run that again.
02:34
You get an AttributeError and it’s pointing at this particular line: .is_a_holiday_foo(). So it worked for this one, didn’t work for this one, and that’s great because we’ve autospec-ed it, so the interface for the Mock is the same as the interface for the actual module.
Become a Member to join the conversation.
