How to patch a constant in python
Question: I have two different modules in my project. One is a config file which
contains

    
    
    LOGGING_ACTIVATED = False
    

This constant is used in the second module (lets call it main) like the
following:

    
    
    if LOGGING_ACTIVATED:
        amqp_connector = Connector()
    

In my test class for the main module i would like to patch this constant with
the value

    
    
    True
    

Unfortunately the following doesn't work

    
    
    @patch("config.LOGGING_ACTIVATED", True)
    

nor does this work:

    
    
    @patch.object("config.LOGGING_ACTIVATED", True)
    

Does anybody know how to patch a constant from different modules?


Answer: If the `if LOGGING_ACTIVATED:` test happens at the _module level_ , you need
to make sure that that module is not yet imported first. Module-level code
runs just once (the first time the module is imported anywhere), you cannot
test code that won't run again.

If the test is in a function, note that the global name used is
`LOGGING_ACTIVATED`, _not_ `config.LOGGING_ACTIVATED`. As such you need to
patch out `main.LOGGING_ACTIVATED` here:

    
    
    @patch("main.LOGGING_ACTIVATED", True)
    

as that's the actual reference you wanted to replace.

Also see the [_Where to patch_
section](https://docs.python.org/3/library/unittest.mock.html#where-to-patch)
of the `mock` documentation.

You should consider refactoring module-level code to something more testable.
Although you can force a reload of module code by deleting the module object
from the `sys.modules` mapping, it is plain cleaner to move code you want to
be testable into a function.

So if your code now looks something like this:

    
    
    if LOGGING_ACTIVATED:
        amqp_connector = Connector()
    

consider using a function instead:

    
    
    def main():
        global amqp_connector
        if LOGGING_ACTIVATED:
            amqp_connector = Connector()
    
    main()
    

or produce an object with attributes even.

