【问题标题】:How to mock an object attribute, I can't access?如何模拟对象属性,我无法访问?
【发布时间】:2016-11-03 15:12:36
【问题描述】:

我试图在我的单元测试中模拟以下视图的 parser.html_source 属性。我想用该页面以前下载的 html 覆盖它。

views.py:

    def parse_online_page(request):
        site_manager = SiteManager(Constants.LOGIN)
        site_manager.login()
        site_manager.change_to_frame(Constants.HEAD)

        parser = HeadParser(html_source=site_manager.page_source)
        parser.parse()

        return redirect('another_page')

这是我的单元测试:

    TESTDATA_PATH = 'core/tests/assets'


    class TestSession(TestCase):
        def test_parser_view(self):
            with patch('core.parsers.HeadParser') as parser_mock:
                with open(os.path.join(TESTDATA_PATH, 'frame_head.html'), encoding='utf8') as f:
                    parser_mock.html_source = f.read()

                    response = self.client.get(reverse('core:parse_online_page'))
                    self.assertEqual(response.status_code, 302)

                    # assert that my html test asset was parsed correctly

不幸的是,这不会覆盖从此类生成的所有实例中的 HeadParser 的 html_source 属性。

我什至不知道这是否是模拟的正确属性,我完全一无所知。

【问题讨论】:

  • 请记住模拟文档中的建议:修补类使用的位置,而不是定义的位置。这意味着你应该嘲笑“views.HeadParser”。
  • 我该怎么做?我认为使用 patch('core.parsers.HeadParser') 作为 parser_mock 会给我一个 HeadParser 的模拟吗?这正是我在标题“我无法访问的属性”中写下的原因。该视图没有 HeadParser 的属性。在这个函数中是局部的。
  • 但它必须在某个地方定义。您肯定会将其导入到该 views.py 模块中。
  • 是的,我使用 from core.parsers import HeadParser 在我的views.py 中导入它所以你的意思是我应该像“with patch('core.myView.HeadParser') as mock_parser”一样进行修补?跨度>
  • 我不知道“myView”是什么,但如果你的意思是“core.views.HeadParser”,那么是的。

标签: python django unit-testing mocking tdd


【解决方案1】:

记住模拟文档中的建议:在使用类的地方打补丁,而不是在定义的地方打补丁。这意味着你应该嘲笑'core.views.HeadParser'

【讨论】:

猜你喜欢
  • 2011-07-05
  • 1970-01-01
  • 2016-07-22
  • 2018-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多