我需要测试对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。我把头发撕成了这个。我唯一的解决方案就是忘记尝试使用迭代器(实际文件可能非常大,这就是我试图避免这样做的原因吗?)
答案 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