Необходимо смоделировать метод write () класса ElementTree из модуля lxml.etree - PullRequest
0 голосов
/ 13 января 2019

Я пишу метод, который использует метод write из класса ElementTree из lxml.etree. Когда я пишу свои тесты, я хочу поиграть с этим, чтобы модульные тесты не записывали кучу вещей на мой диск.

Код в моем файле выглядит примерно так

    # myapp\gla.py
    from lxml.etree import Element, ElementTree

    def my_func(element):
        root = Element(element)
        xml = ElementTree(root)
        xml.write('path_to_file')

Тестирование выглядит так:

    # tests\test_gla.py
    from unittest import patch
    from myapp.gla import my_func

    @patch('myapp.gla.ElementTree.write')
    def test_my_func(self, mock_write):
        my_func('rootElement')
        mock_write.assert_called_once()

Я понял

    Traceback (most recent call last):
      File "C:\Anaconda2\envs\py36\lib\unittest\mock.py", line 1171, in patched
        arg = patching.__enter__()
      File "C:\Anaconda2\envs\py36\lib\unittest\mock.py", line 1243, in __enter__
        original, local = self.get_original()
      File "C:\Anaconda2\envs\py36\lib\unittest\mock.py", line 1217, in get_original
        "%s does not have the attribute %r" % (target, name)
    AttributeError: <cyfunction ElementTree at 0x000001FFB4430BC8> does not have the attribute 'write'

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Нашел ответ на свою проблему.

Переписал тест так:

# tests\test_gla.py
from unittest import patch, MagicMock
from myapp.gla import my_func

@patch('myapp.gla.ElementTree')
def test_my_func(self, mock_write):
    mock_write().write = MagicMock()
    my_func('rootElement')
    mock_write().write.assert_called_once()
0 голосов
/ 16 января 2019

ElementTree - это функция, а не тип . Он возвращает объект типа _ElementTree, и имеет функцию write.

Я не проверял это (я не знаю достаточно / ничего о насмешках), но я подозреваю

 @patch('myapp.gla._ElementTree.write')

должно работать (хотя вам также может потребоваться импортировать _ElementTree самостоятельно).

...