Как макетировать файл без разрешения на чтение в Python3? - PullRequest
0 голосов
/ 29 февраля 2020

Как изменить следующий код так, чтобы тест был пройден ??

import unittest
import unittest.mock as mock


def read_file(file_name):
    '''
        returns: tuple(error_code, data)
                 error_code = 1: file found, data will be read and returned.
                 error_code = 2: file not found, data is None.
                 error_code = 3: file found by cannot read it.
    '''
    try:
        with open(file_name) as fh:
            data = fh.read()
        return 1, data
    except FileNotFoundError:
        return 2, None
    except PermissionError:
        return 3, None


class TestReadFile(unittest.TestCase):
    @mock.patch('builtins.open', mock.mock_open(read_data=b''))
    def test_file_permission(self):
        err_code, data = read_file('file_name')
        assertEqual(err_code, 3)

Я попытался прочитать из этого: https://docs.python.org/3/library/unittest.html, но не смог найти никакого решения.

1 Ответ

0 голосов
/ 29 февраля 2020

Логика c, которую вы использовали в программе, верна, но проблема в том, что вы использовали неправильные идентификаторы в местах:

1) unittest не имеет класса Test, он имеет TestCase

2) Функция, которую вы хотите проверить, называется read_file(), но при ее вызове вы вместо этого вызываете file_read()

3) Ключевым аргументом mock.mock_open() является не data, а read_data.

. Вот код с предлагаемыми изменениями:

import unittest
import unittest.mock as mock


def read_file(file_name):
    '''
        returns: tuple(error_code, data)
                 error_code = 1: file found, data will be read and returned.
                 error_code = 2: file not found, data is None.
                 error_code = 3: file found by cannot read it.
    '''
    try:
        with open(file_name) as fh:
            data = fh.read()
        return 1, data
    except FileNotFoundError:
        return 2, None
    except PermissionError:
        return 3, None


class TestReadFile(unittest.TestCase):
    @mock.patch('builtins.open', mock.mock_open(read_data=''))
    def test_file_permission(self):
        err_code, data = read_file('file_name')
        assertEqual(err_code, 3)
...