如何模拟numpy.fromfile?

时间:2012-06-18 18:15:14

标签: python unit-testing numpy mocking

我正在尝试传递numpy.fromfile一个模拟的file,并且我一直收到以下错误:

  

IOError:!第一个参数必须是一个打开的文件

这是一个基本的例子,使用mock_open取自模拟包的Further Example部分:

import numpy as np
from mock import MagicMock, patch

file_spec = file

def mock_open(mock=None, data=None):
    if mock is None:
        mock = MagicMock(spec=file_spec)

    handle = MagicMock(spec=file_spec)
    handle.write.return_value = None
    if data is None:
        handle.__enter__.return_value = handle
    else:
        handle.__enter__.return_value = data
    mock.return_value = handle
    return mock


if __name__ == "__main__":
    m = mock_open()
    with patch('__main__.open', m, create=True):
        with open('foo', 'rb') as h:
            print h.mock_calls
            try:
                result = np.fromfile(h)
            except IOError:
                print "io error!"
                print h.mock_calls

导致:

% [call.__enter__()] 
% io error!
% [call.__enter__()]

我可以模仿numpy.fromfile,这可能就是我最终要做的事情。我无法理解以下内容

  1. 为什么以上示例不起作用
  2. 为什么我在调试fromfile时遇到问题(在pdb.set_trace()之前调用fromfile并进入fromfile。无论如何,调试器似乎都会跳过调用。< / LI>
  3. 为什么我在fromfile源代码中找不到numpy。这样的函数存在于numpy/numarray/functions.pynumpy/core/records.pynumpy/ma/core.py中,但这些函数都没有像上面列出的那样引发错误。
  4. 非常感谢任何澄清上述问题的帮助。我顺便使用numpy版本1.6.1。

1 个答案:

答案 0 :(得分:1)

我不确定为什么你的模拟open()不起作用,但是因为你立即调用自己的模拟,你有一个更简单的选择:用StringIO创建一个文件,并且把它交给numpy.fromfile。

问题2和问题3可能是由于numpy.fromfile是用C语言编写的。