
pytest_monkeypatch plugin
=========================

safely patch object attributes, dicts and environment variables.

.. contents::
  :local:

Usage
----------------

Use the `monkeypatch funcarg`_ to safely patch environment
variables, object attributes or dictionaries.  For example, if you want
to set the environment variable ``ENV1`` and patch the
``os.path.abspath`` function to return a particular value during a test
function execution you can write it down like this:

.. sourcecode:: python 

    def test_mytest(monkeypatch):
        monkeypatch.setenv('ENV1', 'myval')
        monkeypatch.setattr(os.path, 'abspath', lambda x: '/')
        ... # your test code 

The function argument will do the modifications and memorize the 
old state.  After the test function finished execution all 
modifications will be reverted.  See the `monkeypatch blog post`_ 
for an extensive discussion.  

To add to a possibly existing environment parameter you
can use this example: 

.. sourcecode:: python 

    def test_mypath_finding(monkeypatch):
        monkeypatch.setenv('PATH', 'x/y', prepend=":")
        #  x/y will be at the beginning of $PATH 

.. _`monkeypatch blog post`: http://tetamap.wordpress.com/2009/03/03/monkeypatching-in-unit-tests-done-right/

.. _`monkeypatch funcarg`:


the 'monkeypatch' test function argument
----------------------------------------

The returned ``monkeypatch`` funcarg provides three 
helper methods to modify objects, dictionaries or os.environ::

    monkeypatch.setattr(obj, name, value)  
    monkeypatch.setitem(mapping, name, value) 
    monkeypatch.setenv(name, value) 

All such modifications will be undone when the requesting 
test function finished its execution. 

Start improving this plugin in 30 seconds
=========================================


1. Download `pytest_monkeypatch.py`_ plugin source code 
2. put it somewhere as ``pytest_monkeypatch.py`` into your import path 
3. a subsequent ``py.test`` run will use your local version

Checkout customize_, other plugins_ or `get in contact`_. 

.. include:: links.txt
