diff --git a/AUTHORS b/AUTHORS index 27df00fc6..641e20441 100644 --- a/AUTHORS +++ b/AUTHORS @@ -46,6 +46,7 @@ Jason R. Coombs Jurko Gospodnetić Katarzyna Jachim Kevin Cox +Lee Kamentsky Maciek Fijalkowski Maho Marc Schlaich diff --git a/CHANGELOG b/CHANGELOG index 3e254d34f..0957af637 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,10 @@ 2.8.3.dev --------- +- fix #1169: add __name__ attribute to testcases in TestCaseFunction to + support the @unittest.skip decorator on functions and methods. + Thanks Lee Kamentsky for the PR. + - fix #1035: collecting tests if test module level obj has __getattr__(). Thanks Suor for the report and Bruno Oliveira / Tom Viner for the PR. diff --git a/_pytest/unittest.py b/_pytest/unittest.py index 3b08c9f90..bb7579331 100644 --- a/_pytest/unittest.py +++ b/_pytest/unittest.py @@ -69,12 +69,26 @@ class TestCaseFunction(pytest.Function): def setup(self): self._testcase = self.parent.obj(self.name) + self._fix_unittest_skip_decorator() self._obj = getattr(self._testcase, self.name) if hasattr(self._testcase, 'setup_method'): self._testcase.setup_method(self._obj) if hasattr(self, "_request"): self._request._fillfixtures() + def _fix_unittest_skip_decorator(self): + """ + The @unittest.skip decorator calls functools.wraps(self._testcase) + The call to functools.wraps() fails unless self._testcase + has a __name__ attribute. This is usually automatically supplied + if the test is a function or method, but we need to add manually + here. + + See issue #1169 + """ + if sys.version_info[0] == 2: + setattr(self._testcase, "__name__", self.name) + def teardown(self): if hasattr(self._testcase, 'teardown_method'): self._testcase.teardown_method(self._obj) diff --git a/testing/test_unittest.py b/testing/test_unittest.py index aa055f89c..53dde6ea3 100644 --- a/testing/test_unittest.py +++ b/testing/test_unittest.py @@ -718,3 +718,19 @@ def test_unittest_raise_skip_issue748(testdir): *SKIP*[1]*test_foo.py*skipping due to reasons* *1 skipped* """) + +@pytest.mark.skipif("sys.version_info < (2,7)") +def test_unittest_skip_issue1169(testdir): + testdir.makepyfile(test_foo=""" + import unittest + + class MyTestCase(unittest.TestCase): + @unittest.skip("skipping due to reasons") + def test_skip(self): + self.fail() + """) + result = testdir.runpytest("-v", '-rs') + result.stdout.fnmatch_lines(""" + *SKIP*[1]*skipping due to reasons* + *1 skipped* + """)