模拟对write()的调用

8 投票
3 回答
15987 浏览
提问于 2025-04-17 06:07

我有一个日志记录类,它需要把字符串写入文件。所以,我有一个这样的函数:

def write_to_file(self, string):
  self.__file_handle.write(string)

注意,错误处理的部分我没有写出来。显然,我想在不实际写入文件的情况下测试这个函数。因此,我需要用到 Mock 来模拟。我看到过 这个,它解释了如何模拟打开文件,但对我这里没有帮助——因为我在 __init__ 方法里打开了文件句柄。现在,我可以在 setUp() 方法里做到这一点,但 mock_open 在 setUp 之后似乎就失效了,所以在测试用例中就没法用了。

你会如何写一个测试方法来测试 write_to_file 方法,使用 Mock 呢?

3 个回答

1

我建议从能够在__init__里更改__file_handle开始。因为如果你把它替换成任何一个模拟的或假的对象,只要这个对象有.write这个功能,你就可以测试写入了什么内容。

也许可以创建一个方法来设置__file_handle,然后在这个测试中覆盖这个方法?

4

其实很简单...

from mock import patch

def setUp(self):
    [...]
    mock_file_handle = Mock()
    with patch('__builtin__.open') as mock_file_handle:
        self.sut = Logger()
    [...]

def test_write(self):
    [...]
    self.sut.write_message_to_file("ook?")
    self.assertTrue(self.sut.file_handle.write.called)
    self.assertTrue(self.sut.file_handle.flush.called)
    [...]

如果有人有更好的解决办法,请告诉我...

8

我从谷歌过来的,过了一会儿才意识到这个功能其实从1.0版本开始就已经在mock里内置了,使用的是mock_open

撰写回答