Python automatic testing: mocking an imported module?

Silfheed silfheed at gmail.com
Fri Mar 30 02:55:33 CEST 2007


Wow, that works great!   Thanks all!

On Mar 28, 12:02 am, Ben Finney <bignose+hates-s... at benfinney.id.au>
wrote:
> "Silfheed" <silfh... at gmail.com> writes:
> ===== foo.py =====
> class Bar(object):
>     def __init__(self):
>         self.name = "bar"
> =====
>
> ===== dostuff.py =====
> import foo
>
> def get_bar():
>     return foo.Bar()
> =====
>
> ===== test_dostuff.py =====
> import dostuff
>
> class Mock_foo_module(object):
>     """ Mock object for foo module """
>
>     class Bar(object):
>         def __init__(self):
>             self.name = "banana"
>
> def test_dostuff_get_bar_should_create_bar():
>     """ The dostuff.get_bar function should create a new Bar """
>     dostuff.foo = Mock_foo_module()
>     test_bar = dostuff.get_bar()
>     if not test_bar.name == "banana":
>         raise AssertionError("test_bar.name should be banana")
> =====
>
> This is simply using an instance of a class (Mock_foo_module) to be a
> mock 'module' object. That mock module has the required 'Bar'
> attribute, bound to a class; so the 'dostuff' module's 'foo' attribute
> can be replaced with our mock module object for the purpose of the
> test.
>
> The mock module's Bar class behaves in an idiomatic way (setting the
> 'name' attribute of its instance to a known value) that we use to
> check whether the 'dostuff' module actually used our mock module.
>
> This can be extended to mock any module interface you like, and then
> confirm that the module under test has actually used the module as
> expected.
>
> --
>  \         "A politician is an animal which can sit on a fence and yet |
>   `\               keep both ears to the ground."  -- Henry L. Mencken |
> _o__)                                                                  |
> Ben Finney





More information about the Python-list mailing list