如何在测试函数中创建对象使用的内置函数mock

时间:2017-07-10 11:29:10

标签: python unit-testing mocking

我想从我的Python应用程序中测试一个函数。代码如下所示:

import unittest
from unittest.mock import patch
from mock import MagicMock
import configparser


def read_config_sections(filename):
    cp = configparser.ConfigParser()
    cp.read(filename)
    sections = list()

    for section in cp.sections():
        sections.append(section)
    return sections


class TestReadConfigSection(unittest.TestCase):
    @patch("__main__.open", MagicMock(return_value="[SECTION1]"))
    def test_read_config_sections(self):
        sections = read_config_sections("somename.ini")
        self.assertEqual(["SECTION1"], sections)

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

我想模拟open方法使用的ConfigParser函数来读取配置。谁能告诉我它怎么做得好?当我运行上面的代码时,变量sections是一个空列表。

或许您可以更好地了解如何测试此功能。

2 个答案:

答案 0 :(得分:1)

import configparser
import io
from mock import patch, mock_open
import unittest


def read_config_sections(filename):
    cp = configparser.ConfigParser()
    cp.read(filename)
    sections = list()
    for section in cp.sections():
        sections.append(section)
    return sections


class TestReadConfigSection(unittest.TestCase):
    @patch("builtins.open", return_value=io.StringIO("[SECTION1]"))
    def test_read_config_sections(self, mock_open):
        sections = read_config_sections("somename.ini")
        self.assertEqual(sections, ["SECTION1"])


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

此处找到解决方案:https://mapleoin.github.io/perma/mocking-python-file-open

感谢您的帮助。

最好的问候。

答案 1 :(得分:0)

我相信您需要__builtins__.open而不是__main__.open

您也可以使用mock_open功能。