Improve test coverage for crawler.py

This commit is contained in:
Adrian Chaves 2026-06-26 18:36:09 +02:00
parent cf5607f8bc
commit a212f01160
4 changed files with 88 additions and 0 deletions

View File

@ -0,0 +1,31 @@
import sys
import scrapy
from scrapy.crawler import AsyncCrawlerProcess
from scrapy.settings import Settings
class NoRequestsSpider(scrapy.Spider):
name = "no_request"
async def start(self):
return
yield
settings = Settings()
# The deprecated DNS_RESOLVER setting, set above its default priority so that
# AsyncCrawlerProcess._setup_reactor() emits the deprecation warning.
settings.set("DNS_RESOLVER", "scrapy.resolver.CachingThreadedResolver", priority=10)
if len(sys.argv) > 1 and sys.argv[1] == "twisted-wins":
# TWISTED_DNS_RESOLVER at a higher priority takes precedence over the
# deprecated DNS_RESOLVER setting.
settings.set(
"TWISTED_DNS_RESOLVER",
"scrapy.resolver.CachingThreadedResolver",
priority=20,
)
process = AsyncCrawlerProcess(settings)
process.crawl(NoRequestsSpider)
process.start()

View File

@ -0,0 +1,31 @@
import sys
import scrapy
from scrapy.crawler import CrawlerProcess
from scrapy.settings import Settings
class NoRequestsSpider(scrapy.Spider):
name = "no_request"
async def start(self):
return
yield
settings = Settings()
# The deprecated DNS_RESOLVER setting, set above its default priority so that
# CrawlerProcess._setup_reactor() emits the deprecation warning.
settings.set("DNS_RESOLVER", "scrapy.resolver.CachingThreadedResolver", priority=10)
if len(sys.argv) > 1 and sys.argv[1] == "twisted-wins":
# TWISTED_DNS_RESOLVER at a higher priority takes precedence over the
# deprecated DNS_RESOLVER setting.
settings.set(
"TWISTED_DNS_RESOLVER",
"scrapy.resolver.CachingThreadedResolver",
priority=20,
)
process = CrawlerProcess(settings)
process.crawl(NoRequestsSpider)
process.start()

View File

@ -687,6 +687,22 @@ def test_create_crawler_instance_consistent_with_spider_class() -> None:
assert pre_built.settings["FOO"] == "runner"
@pytest.mark.parametrize("runner_cls", [AsyncCrawlerRunner, CrawlerRunner])
def test_create_crawler_rejects_spider_object(
runner_cls: type[CrawlerRunnerBase],
) -> None:
runner = runner_cls()
with pytest.raises(ValueError, match="cannot be a spider object"):
runner.create_crawler(DefaultSpider())
@pytest.mark.parametrize("runner_cls", [AsyncCrawlerRunner, CrawlerRunner])
def test_crawl_rejects_spider_object(runner_cls: type[CrawlerRunnerBase]) -> None:
runner = runner_cls()
with pytest.raises(ValueError, match="cannot be a spider object"):
runner.crawl(DefaultSpider())
class ExceptionSpider(scrapy.Spider):
name = "exception"

View File

@ -126,6 +126,16 @@ class TestCrawlerProcessSubprocessBase(ScriptRunnerMixin):
assert "TimeoutError" not in log
assert "scrapy.exceptions.CannotResolveHostError" not in log
def test_dns_resolver_deprecated(self) -> None:
log = self.run_script("dns_resolver_deprecated.py")
assert "Spider closed (finished)" in log
assert "The DNS_RESOLVER setting is deprecated" in log
def test_dns_resolver_deprecated_twisted_dns_resolver(self) -> None:
log = self.run_script("dns_resolver_deprecated.py", "twisted-wins")
assert "Spider closed (finished)" in log
assert "The DNS_RESOLVER setting is deprecated" in log
def test_twisted_reactor_asyncio(self) -> None:
log = self.run_script("twisted_reactor_asyncio.py")
assert "Spider closed (finished)" in log