gpt4 book ai didi

python - 有没有办法在 Python 中模拟文件下载?

转载 作者:太空宇宙 更新时间:2023-11-04 10:04:20 26 4
gpt4 key购买 nike

我在 Mock 中使用 Python 2.7。我有一个方法,它接受一个 url 并将其下载到一个临时文件中,然后根据业务逻辑规则重命名文件。我想测试这个重命名逻辑,但首先我必须模拟文件下载部分。这就是我被困的地方。我在无限循环中使用 urllib2.urlopen 及其 read(chunkSize) 方法,检查 read(chunkSize) 是否返回一些值。虽然这种方法在现实生活中有效,并且响应最终被读取到 read(chunkSize) 不返回任何内容的结尾,但我在模拟时得到了一个无限循环。 read(chunkSize) 好像总有一个结果。阅读响应内容后,如何让循环停止?这是我的代码:

import urllib2
from contextlib import closing
import unittest
import mock

def Method(url, temppath):
chunkSize = 16 * 1024
request = urllib2.Request(url)
with closing(urllib2.urlopen(request, timeout = 5)) as response:
with open(temppath, 'wb') as largeFile:
while True:
chunk = response.read(chunkSize)
# print chunk # <- this will endlessly produce '0123456' when tested by test_Method in MyTestCase
if not chunk:
break
largeFile.write(chunk)
# rename file from temppath to something new

class MyTestCase(unittest.TestCase):
@mock.patch('urllib2.urlopen', autospec=True)
@mock.patch('__main__.open', create=True)
def test_Method(self, mock_open, mock_urlopen):
mock_urlopen.return_value.read.return_value = b'0123456'
Method('http://a.bcd/img.png', 'a:\\b\\1234567890.tmp')

if __name__ == '__main__':
unittest.main()

最佳答案

分配值列表以返回到 side_effect attribute:

mock_urlopen.return_value.read.side_effect = [b'0123456', b'']

模拟将遍历每个 read() 调用的值,因此最后一次返回空字节对象的调用将终止循环。

关于python - 有没有办法在 Python 中模拟文件下载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41793765/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com