首页 > 解决方案 > 使用unittest和mock在python函数中修补变量

问题描述

我有以下 my_func.py 和 create_config 函数。

*my_func.py

from fabric.state import env

def create_config(node_name):
    config = {
    "log_level": "INFO",
    "addr1": "127.0.0.1",
    }
    config["addr2"] = env.host
    return config

我尝试了以下方法来模拟 env.host 变量,其中 env 是从 fabric.state 导入的。

*测试.py

import unittest
import my_func
import mock


class MyTestCase(unittest.TestCase):
    def setUp(self):
        self.master_config = {
              "log_level": "INFO",
              "addr2": "0.0.0.0",
              "addr1": "127.0.0.1",
        }

    @mock.patch('env.host')
    def test_create_consul_config(self, mock_host):
        mock_host.return_value = "0.0.0.0"
        result = my_func.create_config('master')
        self.assertDictEqual(self.master_config, result)


if __name__ == '__main__':
    unittest.main()

我收到“env”的导入错误。使用 python mock 在函数中模拟变量的最佳方法是什么?

ImportError: No module named env

标签: pythonunit-testingmockingpython-unittest

解决方案


模拟变量env.host

获取envfirst的类型

In [6]: from fabric.state import env

In [7]: type(env)
Out[7]: fabric.utils._AttributeDict

env.host是一个类的实例变量,mock有点不同,mock_env是object(AttributeDict),instance_variable宿主的赋值是直接赋值,不是带return_value

@mock.patch('my_func.env')
def test_create_consul_config(self, mock_env):
    mock_env.host = 'xxx'
    result = my_func.create_config('master')

    self.assertDictEqual(self.master_config, result)

推荐阅读