diff --git a/scrapy/contracts/__init__.py b/scrapy/contracts/__init__.py index 8315d21d2..de7ac4503 100644 --- a/scrapy/contracts/__init__.py +++ b/scrapy/contracts/__init__.py @@ -1,6 +1,7 @@ import sys import re from functools import wraps +from inspect import getmembers from unittest import TestCase from scrapy.http import Request @@ -17,7 +18,7 @@ class ContractsManager(object): def tested_methods_from_spidercls(self, spidercls): methods = [] - for key, value in vars(spidercls).items(): + for key, value in getmembers(spidercls): if (callable(value) and value.__doc__ and re.search(r'^\s*@', value.__doc__, re.MULTILINE)): methods.append(key) diff --git a/tests/test_contracts.py b/tests/test_contracts.py index b07cbee1e..322d20c4c 100644 --- a/tests/test_contracts.py +++ b/tests/test_contracts.py @@ -101,6 +101,10 @@ class TestSpider(Spider): pass +class InheritsTestSpider(TestSpider): + name = 'inherits_demo_spider' + + class ContractsManagerTest(unittest.TestCase): contracts = [UrlContract, ReturnsContract, ScrapesContract] @@ -202,3 +206,9 @@ class ContractsManagerTest(unittest.TestCase): self.assertFalse(self.results.failures) self.assertTrue(self.results.errors) + + def test_inherited_contracts(self): + spider = InheritsTestSpider() + + requests = self.conman.from_spider(spider, self.results) + self.assertTrue(requests)