jeudi 2 avril 2015

Override a "private" method in a python module

I want to test a function in python, but it relies on a module-level "private" function, that I don't want called, but I'm having trouble overriding/mocking it. Scenario:


module.py



_cmd(command, args):
# do something nasty

function_to_be_tested():
# do cool things
_cmd('rm', '-rf /')
return 1


test_module.py



import module
test_function():
assert module.function_to_be_tested() == 1


Ideally, in this test I dont want to call _cmd. I've looked at some other threads, and I've tried the following with no luck:



test_function():
def _cmd(command, args):
# do nothing
pass
module._cmd = _cmd


although checking module._cmd against _cmd doesn't give the correct reference. Using mock:



from mock import patch

def _cmd_mock(command, args):
# do nothing
pass

@patch('module._cmd', _cmd_mock)
test_function():
...


gives the correct reference when checking module._cmd, although `function_to_be_tested' still uses the original _cmd (as evidenced by it doing nasty things).


This is tricky because _cmd is a module-level function, and I dont want to move it into a module


Aucun commentaire:

Enregistrer un commentaire