繁体   English   中英

在单元测试中模拟解析器对象

[英]Mocking parser object in a unit test

我正在尝试为依赖于解析器(BeautifulSoup)的功能开发单元测试 ,而解析器又依赖于网络访问来获取网页。 为了防止网络访问,我将所有HTML代码复制到了文件中,每当需要该网页时,我都只是从文件中读取它。 但是,我很难模拟解析器。

我的问题是:我应该尝试模拟解析器吗?如果答案是肯定的,那怎么办?

这是我要测试的方法,位于data_processing.py内部:

def get_ocw_course_info(url):
    parser = get_parser(url)
    url_name  = parser.find('meta', {"name":"Search_Display"}).get('content').replace('|', '-')
    description = parser.find('meta', {"name":"Description"}).get('content')

    return dict(url=url,
                url_name=url_name,
                description=description)

这是我为此功能开发的单元测试:

@patch('data_processing.get_parser')
    def test_get_ocw_course_info_unit(self, *args, **kwargs):
        data_processing.get_parser.return_value = BeautifulSoup(read_mock_html('mock_responses/ocw_pass.html'), 'lxml')

        actual = data_processing.get_ocw_course_info('https://ocw.mit.edu/courses/aeronautics-and-astronautics/16-682-prototyping-avionics-spring-2006/assignments/')
        expected = {'url': 'https://ocw.mit.edu/courses/aeronautics-and-astronautics/16-682-prototyping-avionics-spring-2006/assignments/', 
                    'url_name': '16.682 Prototyping Avionics - Assignments', 
                    'description': 'This section contains three of the four assignments from the class.', 
                    }
        self.assertEqual(actual, expected)

我省略了辅助函数的实现,因为它们要么是一个衬里,要么没有什么特别有趣的事情(而且我想名称应该是不言自明的)

我认为您有两种选择:

  1. 在我看来,最简单的方法是在get_ocw_course_info过程中接受可选参数get_parser (将是某种可调用的参数),并使用简单的依赖注入为函数提供可测试的实现。
  2. 您可以通过mock.patch轻松模拟解析器,这就是您这样做的方式(不太了解您的问题所在)。 注意,在经过修饰的测试用例中,您将获得第二个参数,该参数是模拟的,您可以配置:

     @patch('data_processing.get_parser') def test_get_ocw_course_info_unit(self, mock, *args, **kwargs): mock.return_value = ... 

或者,通过另一种方式,您可以通过将预定义的模拟传递给补丁装饰器来提供它:

def get_parser_mocked(): # some suitable return value

@patch('data_processing.get_parser', get_parser_mocked)
def test_get_ocw_course_info_unit(self, *args, **kwargs):
    ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM