模拟对write()的调用
我有一个日志记录类,它需要把字符串写入文件。所以,我有一个这样的函数:
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。