Steven D'Aprano <st...@remove-this-cybersource.com.au> writes: > I have a convention when writing unit tests
Incidentally, you may be interested in the specific forum for testing in Python <URL:http://lists.idyll.org/listinfo/testing-in-python> that is a good resource for asking questions like this. > to put the target of the test into a class attribute, as follows: > > class MyTest(unittest.TestCase): > target = mymodule.someclass > > def test_spam(self): > """Test that someclass has a spam attribute.""" > self.failUnless(hasattr(self.target, 'spam')) > > > It works well until I write a test for stand-alone functions: > > class AnotherTest(unittest.TestCase): > target = mymodule.function > > def test_foo(self): > self.assertEquals(self.target('a', 'b'), 'foo') I think this is because you're binding the ‘target’ attribute at the class definition, binding it to that class. Instead, this smells like something that should be a fixture for each test case:: class SomeClassTestCase(unittest.TestCase): def setUp(self): """ Set up test fixtures. """ self.target = mymodule.SomeClass def test_has_spam(self): """ Should have a spam attribute. """ self.failUnless(hasattr(self.target, 'spam')) def test_has_no_bacon(self): """ Should not have a bacon attribute. """ self.failIf(hasattr(self.target, 'bacon')) class SomeFunctionTest(unittest.TestCase): def setUp(self): """ Set up test fixtures. """ self.target = mymodule.some_function def test_a_b_input_returns_foo(self): """ Should return 'foo' from 'a', 'b' inputs. """ self.assertEquals(self.target('a', 'b'), 'foo') def test_c_d_input_raises_valueerror(self): """ Should raise ValueError from 'c', 'd' inputs. """ self.assertRaises( ValueError, self.target, 'c', 'd') -- \ “A free press is one where it's okay to state the conclusion | `\ you're led to by the evidence.” —Bill Moyers | _o__) | Ben Finney -- http://mail.python.org/mailman/listinfo/python-list