diff options
author | John Szakmeister <john@szakmeister.net> | 2014-02-20 05:02:01 -0500 |
---|---|---|
committer | John Szakmeister <john@szakmeister.net> | 2014-02-20 05:02:01 -0500 |
commit | 023124f42b9e49c105a077dbb2416c64eb0e9f32 (patch) | |
tree | 0dfc64116ed49b08c24837c053d72dea9fed1ab9 | |
parent | 129bd91e222a0ef973ea962eb539763748b54a84 (diff) | |
parent | b65c42fd4e8ade68a5db00d8f089cf3285bd127e (diff) | |
download | nose-023124f42b9e49c105a077dbb2416c64eb0e9f32.tar.gz |
Merge pull request #772 from jszakmeister/fix-771
Fix #771: attr plugin is broken when parent overrides child method
-rw-r--r-- | CHANGELOG | 3 | ||||
-rw-r--r-- | functional_tests/support/issue771/test.py | 16 | ||||
-rw-r--r-- | functional_tests/test_attribute_plugin.py | 14 | ||||
-rw-r--r-- | functional_tests/test_program.py | 12 | ||||
-rw-r--r-- | nose/loader.py | 8 |
5 files changed, 38 insertions, 15 deletions
@@ -64,6 +64,9 @@ In Development - Display the report summary and stack traces even if Ctrl-C was pressed during the test run. Patch by Kevin Qiu. +- Fix #771: attr plugin is broken when parent and child share same method + name with different attributes + Patch by John Szakmeister. Test case provided by Thomas Grainger. 1.3.0 diff --git a/functional_tests/support/issue771/test.py b/functional_tests/support/issue771/test.py new file mode 100644 index 0000000..a81eaa1 --- /dev/null +++ b/functional_tests/support/issue771/test.py @@ -0,0 +1,16 @@ +from nose.plugins.attrib import attr + +from unittest import TestCase + +@attr("b") +def test_b(): + assert 1 == 1 + +class TestBase(TestCase): + def test_a(self): + assert 1 == 1 + +class TestDerived(TestBase): + @attr("a") + def test_a(self): + assert 1 == 1 diff --git a/functional_tests/test_attribute_plugin.py b/functional_tests/test_attribute_plugin.py index a093cd5..249bec5 100644 --- a/functional_tests/test_attribute_plugin.py +++ b/functional_tests/test_attribute_plugin.py @@ -156,6 +156,20 @@ class TestClassAndMethodAttrs(AttributePluginTester): assert 'test_case_three' not in self.output +# Issue #771 +class TestTopLevelNotSelected(AttributePluginTester): + suitepath = os.path.join(support, 'issue771') + args = ["-a", "!a"] + + def verify(self): + # Note: a failure here may mean that the test case selection is broken + # rather than the attribute plugin, but the issue more easily manifests + # itself when using attributes. + assert 'test.test_b ... ok' in self.output + assert 'test_a (test.TestBase) ... ok' in self.output + assert 'TestDerived' not in self.output + + if compat_24: class TestAttributeEval(AttributePluginTester): args = ["-A", "c>20"] diff --git a/functional_tests/test_program.py b/functional_tests/test_program.py index b42b371..6ff600d 100644 --- a/functional_tests/test_program.py +++ b/functional_tests/test_program.py @@ -113,16 +113,8 @@ class TestTestProgram(unittest.TestCase): print "-----" print repr(res) - # some versions of twisted.trial.unittest.TestCase have - # runTest in the base class -- this is wrong! But we have - # to deal with it - if hasattr(TestCase, 'runTest'): - expect = 5 - else: - expect = 4 - self.assertEqual(res.testsRun, expect, - "Expected to run %s tests, ran %s" % - (expect, res.testsRun)) + self.assertEqual(res.testsRun, 4, + "Expected to run 4 tests, ran %s" % (res.testsRun,)) assert not res.wasSuccessful() assert len(res.errors) == 1 diff --git a/nose/loader.py b/nose/loader.py index 480c898..4152a12 100644 --- a/nose/loader.py +++ b/nose/loader.py @@ -104,7 +104,7 @@ class TestLoader(unittest.TestLoader): """ if self.config.getTestCaseNamesCompat: return unittest.TestLoader.getTestCaseNames(self, testCaseClass) - + def wanted(attr, cls=testCaseClass, sel=self.selector): item = getattr(cls, attr, None) if isfunction(item): @@ -112,11 +112,9 @@ class TestLoader(unittest.TestLoader): elif not ismethod(item): return False return sel.wantMethod(item) + cases = filter(wanted, dir(testCaseClass)) - for base in testCaseClass.__bases__: - for case in self.getTestCaseNames(base): - if case not in cases: - cases.append(case) + # add runTest if nothing else picked if not cases and hasattr(testCaseClass, 'runTest'): cases = ['runTest'] |