Unittest and dynamically created methods
Duncan Booth
duncan at NOSPAMrcp.co.uk
Wed Oct 15 04:34:49 EDT 2003
JAWS <jaws at ericsson.ca> wrote five times with HTML attachments:
> I get this error message when trying to run a unittest test with a
> dynamically created test method:
>
> Traceback (most recent call last):
> File "unittest.py", line 215, in __call__
> testMethod()
> TypeError: ?() takes no arguments (1 given)
>
>
<snip>
> base = 'def testCommandFailure2(self):\n\t""" Testing test1 method
> """' +\
> '\n\tstatus, output = commands.getstatusoutput("python " +' + \
> '" ../bin/uimClient.py -p " + str(Test.port) + " -h " +
> Test.host)'+\
> '\n\tself.assertEqual(status, 256)\n'
> code = compile(base, 'uimClientFT.py', 'exec')
> testf = new.function(code, Test.__dict__, 'testCommandFailure2')
> setattr(Test, 'testCommandFailure2', testf)
>
Try adding:
import dis
dis.dis(code)
and it should become obvious. Effectively your code is the same as:
def testf():
def testCommandFailure2(self):
... whatever ...
Test.testCommandFailure2 = testf
so when Test.testCommandFailure2 is called it gets passed a self parameter
which it wasn't expecting.
In short, compiling code which contains a def statement doesn't execute the
def statement until you execute the code.
P.S. I don't know what you are trying to do, but I expect you can achieve
whatever it is you are trying to do more cleanly by not compiling any code
on the fly.
--
Duncan Booth duncan at rcp.co.uk
int month(char *p){return(124864/((p[0]+p[1]-p[2]&0x1f)+1)%12)["\5\x8\3"
"\6\7\xb\1\x9\xa\2\0\4"];} // Who said my code was obscure?
More information about the Python-list
mailing list