summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorNed Batchelder <ned@nedbatchelder.com>2017-01-26 07:36:07 -0500
committerNed Batchelder <ned@nedbatchelder.com>2017-01-26 07:36:07 -0500
commit72fb471371f1d8e2c79d3c7f682628f5d6d1a28d (patch)
treeac228ec3a763ffbd644adaf574eee053054d1f92 /tests
parent2d124b93708636179f5c611eb698ac68901c5931 (diff)
downloadpython-coveragepy-git-72fb471371f1d8e2c79d3c7f682628f5d6d1a28d.tar.gz
Move the decorator out of the metaclass, so we can test it
Diffstat (limited to 'tests')
-rw-r--r--tests/coveragetest.py25
-rw-r--r--tests/test_testing.py25
2 files changed, 36 insertions, 14 deletions
diff --git a/tests/coveragetest.py b/tests/coveragetest.py
index bd5cf9af..306df3b8 100644
--- a/tests/coveragetest.py
+++ b/tests/coveragetest.py
@@ -36,26 +36,27 @@ from tests.helpers import run_command
OK, ERR = 0, 1
+def convert_skip_exceptions(method):
+ """A decorator for test methods to convert StopEverything to SkipTest."""
+ def wrapper(*args, **kwargs):
+ """Run the test method, and convert exceptions."""
+ try:
+ result = method(*args, **kwargs)
+ except StopEverything:
+ raise unittest.SkipTest("StopEverything!")
+ return result
+ return wrapper
+
+
class SkipConvertingMetaclass(type):
"""Decorate all test methods to convert StopEverything to SkipTest."""
def __new__(mcs, name, bases, attrs):
for attr_name, attr_value in attrs.items():
if attr_name.startswith('test_') and isinstance(attr_value, types.FunctionType):
- attrs[attr_name] = mcs.convert_skip_exceptions(attr_value)
+ attrs[attr_name] = convert_skip_exceptions(attr_value)
return super(SkipConvertingMetaclass, mcs).__new__(mcs, name, bases, attrs)
- @classmethod
- def convert_skip_exceptions(mcs, method):
- """The decorator that wraps test methods."""
- def wrapper(*args, **kwargs):
- """Run the test method, and convert StopEverything to SkipTest."""
- try:
- result = method(*args, **kwargs)
- except StopEverything:
- raise unittest.SkipTest("StopEverything!")
- return result
- return wrapper
CoverageTestMethodsMixin = SkipConvertingMetaclass('CoverageTestMethodsMixin', (), {})
diff --git a/tests/test_testing.py b/tests/test_testing.py
index a7f60b31..9776acb4 100644
--- a/tests/test_testing.py
+++ b/tests/test_testing.py
@@ -11,10 +11,11 @@ import sys
import pytest
import coverage
-from coverage.backunittest import TestCase
+from coverage.backunittest import TestCase, unittest
from coverage.files import actual_path
+from coverage.misc import StopEverything
-from tests.coveragetest import CoverageTest
+from tests.coveragetest import CoverageTest, convert_skip_exceptions
from tests.helpers import CheckUniqueFilenames, re_lines, re_line
@@ -203,6 +204,26 @@ def test_re_line_bad(text, pat):
re_line(text, pat)
+def test_convert_skip_exceptions():
+ @convert_skip_exceptions
+ def some_method(ret=None, exc=None):
+ """Be like a test case."""
+ if exc:
+ raise exc("yikes!")
+ return ret
+
+ # Normal flow is normal.
+ assert some_method(ret=[17, 23]) == [17, 23]
+
+ # Exceptions are raised normally.
+ with pytest.raises(ValueError):
+ some_method(exc=ValueError)
+
+ # But a StopEverything becomes a SkipTest.
+ with pytest.raises(unittest.SkipTest):
+ some_method(exc=StopEverything)
+
+
def _same_python_executable(e1, e2):
"""Determine if `e1` and `e2` refer to the same Python executable.