Modifying global variables in Python unittest framework

前端 未结 3 1685
长发绾君心
长发绾君心 2020-12-08 18:48

I am working on a series of unit tests in Python, some of which depend on the value of a configuration variable. These variables are stored in a global Python config file an

相关标签:
3条回答
  • 2020-12-08 19:25

    Use unittest.mock.patch as in @Flimm's answer, if that's available to you.


    Original Answer

    Don't do this:

    from my_module import my_function_with_global_var
    

    But this:

    import my_module
    

    And then you can inject MY_CONFIG_VARIABLE into the imported my_module, without changing the system under test like so:

    class TestSomething(unittest.TestCase): # Fixed that for you!
    
        def test_first_case(self):
             my_module.MY_CONFIG_VARIABLE = True
             self.assertEqual(my_module.my_function_with_global_var(), "First result")
    
        def test_second_case(self):
             my_module.MY_CONFIG_VARIABLE = False
             self.assertEqual(my_module.my_function_with_global_var(), "Second result")
    

    I did something similar in my answer to How can I simulate input to stdin for pyunit? .

    0 讨论(0)
  • 2020-12-08 19:27

    You code imports MY_CONFIG_VARIABLE into the local scope and then immediately overwrites the name with a different object. That won't change the value in the config module. Try

    import config
    config.MY_CONFIG_VARIABLE = False
    

    instead.

    0 讨论(0)
  • 2020-12-08 19:33

    You probably want to mock those global variables instead. The advantage of this is that the globals get reset once you're done. Python ships with a mocking module that lets you do this.

    unittest.mock.patch be used as a decorator:

    class TestSomething(self.unittest):
    
        @patch('config.MY_CONFIG_VARIABLE', True)
        def test_first_case(self):
             self.assertEqual(my_function_with_global_var(), "First result")
    

    You can also use it as a context manager:

        def test_first_case(self):
            with patch('config.MY_CONFIG_VARIABLE', True):
                self.assertEqual(my_function_with_global_var(), "First result")
    
    0 讨论(0)
提交回复
热议问题