首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在单元测试中模拟解析器对象

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

Stack Overflow用户
提问于 2016-12-18 16:29:47
回答 1查看 1.1K关注 0票数 2

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

我的问题是:我是否应该尝试嘲弄一个解析器,如果答案是肯定的,那么应该如何呢?

下面是我正在尝试测试的方法,它在data_processing.py

代码语言:javascript
复制
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)

下面是我为这个函数开发的单元测试:

代码语言:javascript
复制
@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)

我省略了助手函数的实现,因为它们要么是一个行,要么没有什么特别有趣的事情发生(我认为名称应该是非常清楚的)。

EN

回答 1

Stack Overflow用户

发布于 2016-12-18 16:59:50

我想你有两个选择:

  1. 在我看来,最简单的方法是在get_ocw_course_info过程中接受一个可选的参数get_ocw_course_info(它将是某种可调用的),并使用简单的依赖注入来为您的函数提供可测试的实现。
  2. 您可以通过mock.patch轻松地模拟解析器,这就是您所做的方法(不要完全理解您的问题所在)。注意,在修饰测试用例中,您将得到第二个参数,这是您可以配置的模拟参数: @data_processing.get_parser(‘data_processing.get_parser’) def test_get_ocw_course_info_unit(self,mock,*args,**kwargs):mock.return_value =.

或者,另一种方法是通过将预定义的模拟传递给修补程序装饰器来提供:

代码语言:javascript
复制
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):
    ...
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41210441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档