模拟调用write()函数

8

我有一个记录器类,需要将字符串写入文件。因此,我有一个如下所示的方法:

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

注意,错误处理已被删除。 显然,我想在不写入文件的情况下测试它。 因此,使用Mock进行模拟。 我看到了this,它解释了如何模拟打开,但这对我没有帮助 - 我在__init__中打开file_handle。 现在,我可以在setUp()中执行此操作,但mock_open似乎在setUp之后超出范围,因此在测试用例中无用。 您将如何编写一个使用Mock测试write_to_file方法的测试方法?
3个回答

8

我从谷歌跳转到这里,过了一会儿才意识到这已经内置在模拟测试中自1.0版本起就采用mock_open


4

Simple really...

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)
    [...]

如果有更好的解决方案,请告诉我...

1
我会从在__init__中更改__file_handle的能力开始。如果您将其替换为具有.write签名的任何模拟/虚假对象,则可以测试写入到其中的内容。
也许通过创建一个设置__file_handle的方法,然后覆盖此测试的方法来实现?

那是一种方法。但也应该有可能模拟 .write()。 - Sardathrion - against SE abuse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接