unittest help
Duncan Booth
duncan.booth at invalid.invalid
Thu Mar 24 06:11:50 EST 2005
Qiangning Hong wrote:
> As you see, it is an OO wrapper on _extmod, which is a pyrex extension
> module. The question is: how to unittest this class? As the _extmod
> is hardware-dependent, I want to use a mock class to replace it in unit
> test. But how can I let myclass in unittest to import the mock class?
> Like the following:
>
> class MyClassTest(unittest.TestCase):
> def setUp(self):
> import myclass
> import mocklib
> myclass.change_extmod(mocklib.MockExtMod())
> self.testobj = myclass.MyClass() # here MyClass.__init__ will
> call the open
> # method of MockExtMod class
> instead of
> # _extmod.open()
> ...
>
> How to implement the change_extmod? (Or maybe my idea is totally
> wrong?)
>
One way is simply to do:
def setUp(self):
import myclass
self.real_extmod = myclass._extmod
myclass._extmod = mocklib.MockExtMod()
self.testobj = myclass.MyClass()
def tearDown(self):
import myclass
if hasattr(self, testobj):
del self.testobj
myclass._extmod = self.real_extmod
This can be less intrusive than passing the mock object to a constructor,
but it depends very much on the way the objects are used: changing global
state for a unit test is a risky business, for example if an exception is
thrown then tearDown would be called *before* your __del__ method is
invoked. You can work round this by ensuring that the _extmod value is
saved in your instance but that takes you pretty much back to André Malo's
suggestion.
BTW, accessing a global variable from a __del__ method is a bad idea
generally: there is no guarantee that the global variable will still be set
if __del__ is called during program exit.
More information about the Python-list
mailing list