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?
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
, notconfig.LOGGING_ACTIVATED
. As such you need to patch outmain.LOGGING_ACTIVATED
here:as that's the actual reference you wanted to replace.
Also see the Where to patch section 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:
consider using a function instead:
or produce an object with attributes even.