On 16.09.2017 20:06, Paul Hammant wrote:
>
>
>     foo.py:
>
>     import os
>     def my_mocked_os_system(*args, **kwargs):
>         print('a mockery')
>     os.system = my_mocked_os_system
>
>
>     bar.py:
>
>     import os
>     os.system("echo bar")
>
>     import foo
>     os.system("echo foo")
>
>
>     Then:
>
>     $ PYTHONPATH=. python bar.py
>     bar
>     a mockery
>
>
> I've spent the last 5 hours looking at mock decorators for Python (and
> MagicMock and stackoverflow and blogs). I can't get it working on my
> own - I'm not experienced enough with Python.  Specifically, I can't
> do it _less_ lines of code and have it the correct Pythonic way. I
> need help from someone that's prepared to remote pair on it.

Why are you complicating your life with trying to implement complex
decorators? Python decorators are _hard_.  Just replace the default
functions in the module in the testcase setup method and restore them in
the teardown method. Or write a simple context manager and use it in
your test case, e.g., like this:

    def test_foo():
        with mock_my_stuff():
            # code for testing foo goes here
            pass


Now all you have to do is write the mock_my_stuff() function, which
should return a context manager object that injects the mock functions
into the module in its __enter__() method an restores them in the
__exit__() method. This standard module will help make this even
simpler: https://docs.python.org/2/library/contextlib.html

-- Brane

Reply via email to