1

我正在尝试模拟 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()

但两者都不会捕获方法调用。

4

1 回答 1

1

assert_called_once简而言之:如果返回值open不是模拟对象,则无法跟踪正在调用该函数。StringIO因此,我们可以将其MagicMock作为一个文件句柄,而不是将返回值设为 a。

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()
于 2018-10-10T10:47:28.877 回答