我正在尝试为函数开发一个单元测试,该函数依赖于解析器(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)我省略了助手函数的实现,因为它们要么是一个行,要么没有什么特别有趣的事情发生(我认为名称应该是非常清楚的)。
发布于 2016-12-18 16:59:50
我想你有两个选择:
get_ocw_course_info过程中接受一个可选的参数get_ocw_course_info(它将是某种可调用的),并使用简单的依赖注入来为您的函数提供可测试的实现。mock.patch轻松地模拟解析器,这就是您所做的方法(不要完全理解您的问题所在)。注意,在修饰测试用例中,您将得到第二个参数,这是您可以配置的模拟参数:
@data_processing.get_parser(‘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):
...https://stackoverflow.com/questions/41210441
复制相似问题