How about "pure virtual methods"?

Jp Calderone exarkun at divmod.com
Wed Dec 22 03:59:28 CET 2004


On Wed, 22 Dec 2004 02:27:35 +0200, Noam Raphael <noamr at remove.the.dot.myrea.lbox.com> wrote:
>Jeff Shannon wrote:
> > In the context of changing an existing interface, a unit-testing 
> > scenario would mean that, instead of installing a "pure virtual" method 
> > on a base class, you'd change the unit-tests to follow the new 
> > specification, and then write code that would pass the unit tests.  If 
> > you are subclassing from a common base, then you'd only need to change 
> > the unit test for that common base class (presuming that all derived 
> > classes would run those unit tests as well).
> > 
> The problem is that I couldn't write a general unit test, since the base 
> class wasn't instantiable - there wasn't even any point in making it 
> instantiable, since every subclass was constructed with different 
> argument definition. They were just required to provide some methods 
> (check whether they contain an object, for example) - I don't know how 
> to write a unit test for such a base class, or what does it mean. (Well, 
> it may mean: check whether all the required methods exist, but come on - 
> that's exactly the idea of my suggestion. There's no point in having to 
> write the list of required methods another time).

  from harness import TestCase

  class FoobarTestCase(TestCase):
      def instanceFactory(self):
          raise NotImplementedError()

      def testBazMethod(self):
          inst = self.instanceFactory()
          self.assertEquals(inst.baz(), 'baz')
          ...

  class QuuxTestCase(FoobarTestCase):
      def instanceFactory(self):
          return Quux(x=y, a=b)

  class WibbleTestCase(FoobarTestCase):
      def instanceFactory(self):
          return Wibble(1, 2, 3)

  This lets you avoid duplicate test code as well as easily test
new concrete implementations.  It's an ideal approach for frameworks
which mandate application-level implementations of a particular 
interface and want to ease the application developer's task.

  Jp



More information about the Python-list mailing list