Merge pull request #83 from wolever/issue-73-setup-teardown

Fix issue #73: setup/teardown in parameterized classes
diff --git a/CHANGELOG.txt b/CHANGELOG.txt
index f471735..af6122c 100644
--- a/CHANGELOG.txt
+++ b/CHANGELOG.txt
@@ -1,3 +1,6 @@
+0.7.1 (2019-11-19)
+    * Fix #73: calling `setUp` and `tearDown` in parameterized classes
+
 0.7.0 (2019-02-05)
     * Added parameterized_class feature, for parameterizing entire test
       classes (many thanks to @TobyLL for their suggestions and help testing!)
diff --git a/parameterized/parameterized.py b/parameterized/parameterized.py
index 96a662f..dd9f0ed 100644
--- a/parameterized/parameterized.py
+++ b/parameterized/parameterized.py
@@ -591,4 +591,15 @@
 
             test_class_module[name] = type(name, (base_class, ), test_class_dict)
 
+        # We need to leave the base class in place (see issue #73), but if we
+        # leave the test_ methods in place, the test runner will try to pick
+        # them up and run them... which doesn't make sense, since no parameters
+        # will have been applied.
+        # Address this by iterating over the base class and remove all test
+        # methods.
+        for method_name in list(base_class.__dict__):
+            if method_name.startswith("test_"):
+                delattr(base_class, method_name)
+        return base_class
+
     return decorator
diff --git a/parameterized/test.py b/parameterized/test.py
index c5fae1c..0621b6a 100644
--- a/parameterized/test.py
+++ b/parameterized/test.py
@@ -481,13 +481,35 @@
 ])
 class TestParameterizedClassDict(TestCase):
     expect([
+        "TestParameterizedClassDict_0:setUp(1, 0)",
+        "TestParameterizedClassDict_0:tearDown(1, 0)",
         "TestParameterizedClassDict_0:test_method(1, 0)",
         "TestParameterizedClassDict_1:test_method(0, 1)",
+        "TestParameterizedClassDict_1:setUp(0, 1)",
+        "TestParameterizedClassDict_1:tearDown(0, 1)",
     ])
 
     foo = 0
     bar = 0
 
+    def setUp(self):
+        # Ensure that super() works (issue #73)
+        super(TestParameterizedClassDict, self).setUp()
+        missing_tests.remove("%s:setUp(%r, %r)" %(
+            self.__class__.__name__,
+            self.foo,
+            self.bar,
+        ))
+
+    def tearDown(self):
+        # Ensure that super() works (issue #73)
+        super(TestParameterizedClassDict, self).tearDown()
+        missing_tests.remove("%s:tearDown(%r, %r)" %(
+            self.__class__.__name__,
+            self.foo,
+            self.bar,
+        ))
+
     def test_method(self):
         missing_tests.remove("%s:test_method(%r, %r)" %(
             self.__class__.__name__,
diff --git a/setup.py b/setup.py
index 0082729..8c2dc57 100644
--- a/setup.py
+++ b/setup.py
@@ -14,7 +14,7 @@
 
 setup(
     name="parameterized",
-    version="0.7.0",
+    version="0.7.1",
     url="https://github.com/wolever/parameterized",
     license="FreeBSD",
     author="David Wolever",