Python MagicMock слишком много издевается при использовании декоратора - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь получить документацию на сборку ReadTheDocs через Sphinx. Классы, которые я документирую, наследуют от более обширного Framework, который я не могу легко установить и, следовательно, хотел бы высмеивать. Тем не менее, Мок, кажется, слишком жадный в издевательстве над классами, которые я действительно хотел бы задокументировать. Код, о котором идет речь, выглядит следующим образом:

# imports that need to be mocked
from big.framework import a_class_decorator, ..., SomeBaseClass


@a_class_decorator("foo", "bar")
class ToDocument(SomeBaseClass):
    """ Lots of nice documentation here

    which will never appear
    """

def a_function_that_is_being_documented():
    """ This will show up on RTD
    """

Я дошел до того, что убедился, что не слепо издеваюсь над декоратором, а вместо этого явно указывал в своем Сфинксе conf.py. В противном случае, я следую рекомендациям RTD для модулей-макетов:

class MyMock(MagicMock):

    @classmethod
    def a_class_decorator(cls, classid, version):
        def real_decorator(theClass):                
             print(theClass)
             return theClass     
        return real_decorator

    @classmethod
    def __getattr__(cls, name):
        return MagicMock()

sys.modules['big.framework'] = MyMock()

Теперь я ожидаю, что для распечатки я получу что-то, относящееся к моему документируемому классу, например <ToDocument ...>.

Однако я всегда получаю Mock для этого класса, <MagicMock spec='str' id='139887652701072'>, который, конечно, не имеет документации, которую я пытаюсь создать. Есть идеи?

1 Ответ

0 голосов
/ 31 августа 2018

Оказывается, проблема заключалась в наследовании от поддельного класса. Начните явно с базового класса и создания пустого класса

class SomeBaseClass:
    pass

для исправления в conf.py решена проблема

...