Test callback kwargs

This commit is contained in:
Eugenio Lacuesta 2019-01-09 10:40:44 -03:00
parent 770a501fb3
commit 57e7c76977
2 changed files with 41 additions and 1 deletions

View File

@ -28,6 +28,40 @@ class MetaSpider(MockServerSpider):
self.meta['close_reason'] = reason
class KeywordArgumentsSpider(MockServerSpider):
name = 'kwargs'
checks = set()
def start_requests(self):
data = {'key': 'value', 'number': 123}
yield Request(self.mockserver.url('/first'), self.parse_first, kwargs=data)
yield Request(self.mockserver.url('/general_with'), self.parse_general, kwargs=data)
yield Request(self.mockserver.url('/general_without'), self.parse_general)
yield Request(self.mockserver.url('/no_kwargs'), self.parse_no_kwargs)
def parse_first(self, response, key, number):
self.checks.add(key == 'value')
self.checks.add(number == 123)
yield response.follow(
self.mockserver.url('/two'),
self.parse_second,
kwargs={'new_key': 'new_value'})
def parse_second(self, response, new_key):
self.checks.add(new_key == 'new_value')
def parse_general(self, response, **kwargs):
if response.url.endswith('/general_with'):
self.checks.add(kwargs['key'] == 'value')
self.checks.add(kwargs['number'] == 123)
elif response.url.endswith('/general_without'):
self.checks.add(kwargs == {})
def parse_no_kwargs(self, response):
pass
class FollowAllSpider(MetaSpider):
name = 'follow'

View File

@ -8,7 +8,7 @@ from twisted.trial.unittest import TestCase
from scrapy.http import Request
from scrapy.crawler import CrawlerRunner
from scrapy.utils.python import to_unicode
from tests.spiders import FollowAllSpider, DelaySpider, SimpleSpider, \
from tests.spiders import FollowAllSpider, DelaySpider, SimpleSpider, KeywordArgumentsSpider, \
BrokenStartRequestsSpider, SingleRequestSpider, DuplicateStartRequestsSpider
from tests.mockserver import MockServer
@ -23,6 +23,12 @@ class CrawlTestCase(TestCase):
def tearDown(self):
self.mockserver.__exit__(None, None, None)
@defer.inlineCallbacks
def test_callback_kwargs(self):
crawler = self.runner.create_crawler(KeywordArgumentsSpider)
yield crawler.crawl(mockserver=self.mockserver)
self.assertEqual(crawler.spider.checks, set([True]))
@defer.inlineCallbacks
def test_follow_all(self):
crawler = self.runner.create_crawler(FollowAllSpider)