如何在unitest框架中模拟文本文件python2.7的创建?

时间:2017-02-20 15:55:12

标签: python-2.7 mocking patch python-unittest

我有一个函数,首先检查txt文件是否存在,如果不存在则创建一个。如果txt文件已经存在,则会读取信息。我正在尝试编写单元测试来检查函数的逻辑是否正确。我想修补文件存在,文件创建和文件读取等问题。 要测试的功能如下所示:

import json
import os.path

def read_create_file():

    filename = 'directory/filename.txt'
    info_from_file = []

    if os.path.exists(filename):

        with open(filename, 'r') as f:
            content = f.readlines()
            for i in range(len(content)):
                info_from_file.append(json.loads(content[i]))
        return info_from_file

    else:
        with open(filename, 'w') as f:
            pass

        return []

unittest看起来像这样:

import unittest
import mock
from mock import patch


class TestReadCreateFile(unittest.TestCase):

    def setUp(self):
        pass

    def function(self):
        return read_create_file()

    @patch("os.path.exists", return_value=False)
    @mock.patch('directory/filename.txt.open', new=mock.mock_open())
    def test_file_does_not_exist(self, mock_existence, mock_open_patch):
        result = self.function()
        self.assertEqual(result, (True, []))

错误:ImportError:不支持按文件名导入。

或者像这样:

import unittest
import mock
from mock import patch

@patch("os.path.exists", return_value=False)
def test_file_not_exist_yet(self, mock_existence):
    m = mock.mock_open()
    with patch('__main__.open', m, create=True):
        handle = open('directory/filename.txt', 'w')
    result = self.function()

    self.assertEqual(result, (True, {}))

错误: IOError:[Errno 2]没有这样的文件或目录:' directory / filename.txt'

作为一个新手,我似乎无法理解解决方案,非常感谢任何帮助。

谢谢

1 个答案:

答案 0 :(得分:0)

你嘲笑os.path.exists错了。当您从被测试文件中修补补丁时。

@patch("path_to_method_under_test.path.exists", return_value=False)
def test_file_not_exist_yet(self, mock_existence):