Python模拟 - 模拟几个开放

San*_*nda 6 python file-io mocking with-statement

阅读本文后:如何模拟with语句中使用的open(使用Python中的Mock框架)?

我可以使用以下方法在python中模拟open函数:

with patch(open_name, create=True) as mock_open:
    mock_open.return_value = MagicMock(spec=file)
    m_file = mock_open.return_value.__enter__.return_value
    m_file.read.return_value = 'text1'

    diffman = Diffman()
    diffman.diff(path1, path2)
Run Code Online (Sandbox Code Playgroud)

当我的测试方法使用一个开放语句时,它运行良好.这是我测试的方法:

def diff(self, a, b):
    with open(a, 'r') as old:
        with open(b, 'r') as new:
            oldtext = old.read()
            newtext = new.read()
Run Code Online (Sandbox Code Playgroud)

oldtext和newtext的值相同(此处为'text1').

我想为oldtext设置'text1',为newtext设置'text2'.

我怎样才能做到这一点 ?

Gle*_*enn 5

这是获得所需内容的快捷方式.它有点欺骗,因为被测方法中的两个文件对象是同一个对象,我们只是在每次读取后更改读取调用的返回值.如果您希望文件对象不同,您可以在多个层中使用相同的技术,但它会非常混乱,并且可能会不必要地掩盖测试的意图.

替换此行:

    m_file.read.return_value = 'text1'

有:

    reads = ['text1', 'text2']
    m_file.read.side_effect = lambda: reads.pop(0)