获取模拟文件的实际返回值.read()

Bri*_*cks 6 python tdd mocking python-mock

我正在使用python-mock来模拟文件打开调用.我希望能够以这种方式传递伪数据,因此我可以验证read()是否正在调用以及使用测试数据而无需在测试中访问文件系统.

这是我到目前为止所得到的:

file_mock = MagicMock(spec=file)
file_mock.read.return_value = 'test'

with patch('__builtin__.open', create=True) as mock_open:
    mock_open.return_value = file_mock

    with open('x') as f:
        print f.read()
Run Code Online (Sandbox Code Playgroud)

正如我所假设<mock.Mock object at 0x8f4aaec>'test'那样输出.我在构建这个模拟时做错了什么?

编辑:

看起来像这样:

with open('x') as f:
     f.read()
Run Code Online (Sandbox Code Playgroud)

还有这个:

f = open('x')
f.read()
Run Code Online (Sandbox Code Playgroud)

是不同的对象.使用mock作为上下文管理器使它返回一个新的Mock,而直接调用它返回我已定义的内容mock_open.return_value.有任何想法吗?

Mic*_*kel 11

对于StringIO已经实现文件接口的对象来说,这听起来像是一个很好的用例.也许你可以做一个file_mock = MagicMock(spec=file, wraps=StringIO('test')).或者你可以让你的函数接受一个类似文件的对象并传递它StringIO而不是真正的文件,避免需要丑陋的猴子修补.

你看过模拟文档吗?

http://www.voidspace.org.uk/python/mock/compare.html#mocking-the-builtin-open-used-as-a-context-manager

  • 如果该网站到目前为止仍然是最新的,那将会很有帮助。现在答案变得有点无用了。 (5认同)

tbc*_*bc0 10

在Python 3中,模式很简单:

>>> import unittest.mock as um
>>> with um.patch('builtins.open', um.mock_open(read_data='test')):
...     with open('/dev/null') as f:
...         print(f.read())
...
test
>>>
Run Code Online (Sandbox Code Playgroud)

(是的,你甚至可以模拟/ dev/null来返回文件内容.)