如何模拟对象属性,我无法访问?

时间:2016-07-01 09:11:37

标签: python django unit-testing mocking tdd

我正在尝试在单元测试中模拟以下视图的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属性。

我甚至不知道这是否是嘲笑的正确属性,我完全无能为力。

1 个答案:

答案 0 :(得分:3)

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