How to patch a constant in python

后端 未结 3 1791
南旧
南旧 2020-12-18 18:01

I have two different modules in my project. One is a config file which contains

LOGGING_ACTIVATED = False

This constant is used in the seco

3条回答
  •  爱一瞬间的悲伤
    2020-12-18 18:23

    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 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.

提交回复
热议问题