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