Python насмешливо открывать и проверять на закрытие - PullRequest
0 голосов
/ 09 октября 2018

Я пытаюсь смоделировать open и хочу проверить, вызывается ли close хотя бы раз

class MyObject():
    def __init__(self,path):
        fp = open(path)
        self.file_list = []
        for line in fp:
            self.file_list.append(line.strip())
        fp.close()   



def testsimpleFile():
    fake_file = io.StringIO("data.csv\ndata2.csv")
    with patch("builtins.open",return_value=fake_file,create=True) as mock_file:
        f = MyObject("path/to/open/test.f")
        mock_file.assert_called_once_with("/path/to/open/test.f")
        golden_list = ["data.csv","data2.csv"]
        assert f.file_list == golden_list

Это мой рабочий тестовый код до сих пор, и теперь я хочу дополнительно проверить, был ли вызван метод closeя попытался добавить

mock_file.close.assert_called_once()

и

mock_file.fake_file.close.assert_called_once()

, но оба не поймают вызов метода.

1 Ответ

0 голосов
/ 10 октября 2018

Короче говоря: вы не можете отследить, что функция вызывается с assert_called_once, если возвращаемое значение open не является фиктивным объектом.Таким образом, вместо того, чтобы сделать возвращаемое значение StringIO, мы можем сделать его MagicMock, который будет действовать как дескриптор файла.

import io
from unittest.mock import patch, MagicMock

class MyObject():
    def __init__(self,path):
        fp = open(path)
        self.file_list = []
        for line in fp:
            self.file_list.append(line.strip())
        fp.close()   

def testsimpleFile():
    fake_file = MagicMock()
    fake_file.__iter__.return_value = ["data.csv", "data2.csv"]
    with patch("builtins.open", return_value=fake_file, create=True) as mock_file:
        f = MyObject("/path/to/open/test.f")
        mock_file.assert_called_once_with("/path/to/open/test.f")
        golden_list = ["data.csv", "data2.csv"]
        assert f.file_list == golden_list
        fake_file.close.assert_called_once()
...