Исправление переменной в функции Python с unittest и mock - PullRequest
0 голосов
/ 17 января 2019

У меня есть следующий 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.

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

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Из документации unittest.mock по исправлению (примечание target - первый аргумент patch):

target должен быть строкой в ​​форме «package.module.ClassName». цель импортируется, а указанный объект заменяется новым объект, поэтому цель должна быть импортирована из среды, в которой вы находитесь вызывая patch () из. Цель импортируется при оформлении функция выполняется, а не во время оформления.

Так что вам нужно указать полный путь к функции, которую вы исправляете. Также обратите внимание, что в , где установить исправление , указывается, что целью должен быть путь к месту использования функции / объекта, а не место его определения.

Итак, изменив свой patch вызов на:

@mock.patch("my_func.env.host")

должен исправить ImportError.

0 голосов
/ 17 января 2019

фиктивная переменная env.host?

получить тип env первый

In [6]: from fabric.state import env

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

env.host - переменная экземпляра класса, макет немного отличается, mock_env - объект (AttributeDict), назначение хоста instance_variable - прямое назначение, а не возвращаемое значение

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