Python:模拟打开文件,返回实际文件

时间:2017-01-11 01:09:24

标签: python-2.7 unit-testing

我需要测试对gzip.open的调用,但我需要它为它提供一个包含测试数据的实际测试文件来读取。我看过几个非常相似的问题,但没有一个能按预期工作。

这是我测试的代码:

with gzip.open(local_file_path,'r') as content:
    for line in content:
        try:
            if line.startswith('#'):
                continue
            line_data = line.split('\t')
            request_key = line_data[LINE_FORMAT['date']]
            request_key += '-' + line_data[LINE_FORMAT['time']][:-3]
            request_key += '-' + line_data[LINE_FORMAT['source_ip']]
            if request_key in result.keys():
                result[request_key] += 1
            else:
                result[request_key] = 1
            num_requests += 1

        except Exception, e:
            print ("[get_outstanding_requesters] \t\tError to process line: %s"%line)

我认为问题与所讨论的问题here有关,因为代码将文件视为迭代器,但所讨论的解决方法都没有对我有用。

我尝试过这方面的变体:

test_data = open('test_access_log').read()
m = mock.mock_open(read_data=test_data)
m.return_value.__iter__ = lambda self:self
m.return_value.__next__ = lambda self: self.readline()
with mock.patch('gzip.open', m):
    with gzip.open('asdf') as f:
       for i in f:
         print i

结果是:

  

TypeError:iter()返回类型' MagicMock'

的非迭代器

我使用的是Python 2.7。我把头发撕成了这个。我唯一的解决方案就是忘记尝试使用迭代器(实际文件可能非常大,这就是我试图避免这样做的原因吗?)

1 个答案:

答案 0 :(得分:1)

这是有效的:

import unittest
import mock

test_data = open('test_access_log').read()
m = mock.mock_open(read_data=test_data)
m.return_value.__iter__.return_value = test_data.splitlines()
with mock.patch('gzip.open', m):
  with gzip.open('test_access_log') as f:
    for i in f:
      print i

感谢bash-shell.net