I've been beating my head against the wall trying to figure out how to build a 
Mock of APISite.  If I do the obvious:

    site = mocker.MagicMock(spec=APISite)

I end up with:

> AttributeError: Mock object has no attribute 'encodings'

Yet, if I hand-build a Site object, sure enough it does:

>>> import pywikibot
>>> site = pywikibot.Site("en", "wikipedia")
>>> site.encodings()
('utf-8', 'iso-8859-1')
>>> 

To make a long story short, eventually I found this bit of magic in 
_basesite.py:

>     def __getattr__(self, attr):
>         """Delegate undefined methods calls to the Family object."""
>         if hasattr(self.__class__, attr):
>             return getattr(self.__class__, attr)
>         try:
>             method = getattr(self.family, attr)
>             if not callable(method):
>                 raise AttributeError
>             f = functools.partial(method, self.code)
>             if hasattr(method, '__doc__'):
>                 f.__doc__ = method.__doc__
>             return f
>         except AttributeError:
>             raise AttributeError("{} instance has no attribute '{}'"
>                                  .format(self.__class__.__name__, attr))


WTF?  I mean, I see what it's doing, but why go to this level of obfuscation?  
It's basically reimplementing class inheritance manually (and in a way which is 
totally beyond the ability of Mock to understand).
_______________________________________________
pywikibot mailing list -- pywikibot@lists.wikimedia.org
To unsubscribe send an email to pywikibot-le...@lists.wikimedia.org

Reply via email to