Ben Finney wrote: > Maybe I need to factor out the iteration into a generic iteration > function, taking the actual test as a function object. That way, the > dataset iterator doesn't need to know about the test function, and > vice versa. > > def iterate_test(self, test_func, test_params=None): > """ Iterate a test function for all the sets """ > if not test_params: > test_params = self.game_params > for key, params in test_params.items(): > dataset = params['dataset'] > instance = params['instance'] > test_func(key, dataset, instance) > > def test_score_throws(self): > """ Game score should be calculated from throws """ > def test_func(key, dataset, instance): > score = dataset['score'] > for throw in dataset['throws']: > instance.add_throw(throw) > self.failUnlessEqual(score, instance.get_score()) > > self.iterate_test(test_func) > > That's somewhat clearer; the test function actually focuses on what > it's testing. Those layers of indirection are annoying, but they allow > the data sets to grow without writing more code to handle them.
Don't know if this helps, but I'd be more likely to write this as something like (untested):: def get_tests(self, test_params=None): """ Iterate a test function for all the sets """ if not test_params: test_params = self.game_params for key, params in test_params.items(): dataset = params['dataset'] instance = params['instance'] yield key, dataset, instance def test_score_throws(self): """ Game score should be calculated from throws """ for key, dataset, instance in self.get_tests() score = dataset['score'] for throw in dataset['throws']: instance.add_throw(throw) self.failUnlessEqual(score, instance.get_score()) That is, make an interator to the various test information, and just put your "test_func" code inside a for-loop. STeVe -- http://mail.python.org/mailman/listinfo/python-list