首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何正确测试Scrapy spider Python生成器函数?

如何正确测试Scrapy spider Python生成器函数?
EN

Stack Overflow用户
提问于 2016-05-05 15:33:08
回答 1查看 449关注 0票数 1

我有一个Scrapy XMLFeedSpider,我正在尝试测试以下parse_node函数:

代码语言:javascript
运行
复制
def parse_node(self, response, selector):
    date = selector.xpath('pubDate/text()').extract_first()
    url = selector.xpath('link/text()').extract_first()               
    if date < self.cutoff_date:  # TEST VALIDITY OF THE DATE
        print "Invalid date"
        self.log("Article %s before crawler start date" % url)
    else:
        print "Valid date"
        yield scrapy.Request(url, self.parse_post)

我试图测试该函数的有效日期和无效日期:

代码语言:javascript
运行
复制
@mock.patch('my_spiders.spiders.myspider.scrapy.Request')               
def test_parse_node(self, scrapy_request):                                      
    scrapy_request.return_value = mock.MagicMock()                              
    self.spider.log = mock.MagicMock()                                          
    mock_response = mock.MagicMock()                                            
    mock_selector = mock.MagicMock()                                            
    date = self.spider.start_date.strftime("%c")                                
    url = "https://google.com"                                                  
    mock_selector.xpath.return_value.extract_first = mock.MagicMock(            
        side_effect=[date, url]                                                 
    )                                                                           
    parsed_node = self.spider.parse_node(mock_response, mock_selector)          
    self.assertEqual(tuple(parsed_node)[0], scrapy_request.return_value)        
    self.spider.log.assert_not_called()                                         
    scrapy_request.assert_called_once_with(url, self.spider.parse_post)         

@mock.patch('my_spiders.spiders.myspider.scrapy.Request')               
def test_parse_node_invalid_date(self, scrapy_request):                         
    scrapy_request.return_value = mock.MagicMock()                              
    self.spider.log = mock.MagicMock()                                          
    mock_response = mock.MagicMock()                                            
    mock_selector = mock.MagicMock()                                            
    date_object = self.spider.start_date - datetime.timedelta(days=1)           
    date = date_object.strftime("%c")                                           
    url = "https://google.com"                                                  
    mock_selector.xpath.return_value.extract_first = mock.MagicMock(            
        side_effect=[date, url]                                                 
    )                                                                           

    parsed_node = self.spider.parse_node(mock_response, mock_selector)          
    # TODO: figure out why this doesn't work                                    
    # self.spider.log.assert_called_once()                                   
    scrapy_request.assert_not_called()  

第一个测试,test_parse_node按预期运行。问题在于test_parse_node_invalid_date函数。如果我将调试器放入parse_node函数中,则不会调用调试器。print函数也不会被调用。

我怀疑这是yield语句/生成器的某种问题,但不知道发生了什么。为什么第二个测试没有像我预期的那样在parse_node函数中运行呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-17 20:48:18

python生成器函数只返回一个迭代器。要实际调试迭代器,我必须通过调用next()方法启动迭代过程:

代码语言:javascript
运行
复制
parsed_node = self.spider.parse_node(mock_response, mock_selector).next()

我还必须确保每个测试实例化一个新生成器,因为生成器只能重复一次。

然后,我可以逐步完成和调试/完成我的测试,视需要。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37054536

复制
相关文章

相似问题

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