需要从 lxml.etree 模块模拟 ElementTree 类的 write() 方法

我正在编写一个方法,该方法使用 lxml.etree 中 ElementTree 类的 write 方法。在编写我的测试时,我想模拟一下,这样单元测试就不会向我的驱动器写一堆东西。


我文件中的代码看起来像这样


    # 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'


慕婉清6462132
浏览 315回答 2
2回答

桃花长相依

找到了我自己的问题的答案。像这样重新编写测试:# tests\test_gla.pyfrom unittest import patch, MagicMockfrom myapp.gla import my_func@patch('myapp.gla.ElementTree')def test_my_func(self, mock_write):&nbsp; &nbsp; mock_write().write = MagicMock()&nbsp; &nbsp; my_func('rootElement')&nbsp; &nbsp; mock_write().write.assert_called_once()

动漫人物

ElementTree是一个函数,而不是一个类型。它返回一个类型的对象,_ElementTree它具有函数write。我还没有测试过这个(我不太了解/关于模拟的任何事情),但我怀疑&nbsp;@patch('myapp.gla._ElementTree.write')应该可以工作(尽管您可能还需要_ElementTree自己导入)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python