我有一些python代碼,它使用requests成功從URL下載圖像,並將其保存到/tmp/
中。我想測試這是否應該。我使用responses來測試抓取JSON文件,但我不知道如何模擬抓取文件的行爲。使用Python請求和響應模擬下載文件
我認爲這將會是類似嘲諷一個標準的響應,如下面的,但我想我消隱如何設置body
是一個文件...
@responses.activate
def test_download():
responses.add(responses.GET, 'http://example.org/images/my_image.jpg',
body='', status=200,
content_type='image/jpeg')
#...
UPDATE :繼Ashafix的評論,我想這(蟒蛇3):
from io import BytesIO
@responses.activate
def test_download():
with open('tests/images/tester.jpg', 'rb') as img1:
imgIO = BytesIO(img1.read())
responses.add(responses.GET, 'http://example.org/images/my_image.jpg',
body=imgIO, status=200,
content_type='image/jpeg')
imgIO.seek(0)
#...
但當隨後,我測試的嘗試做請求的代碼我得到:
a bytes-like object is required, not '_io.BytesIO'
感覺就像是幾乎正確,但我很難過。
更新2:試圖跟隨史蒂夫·傑索普的建議:
@responses.activate
def test_download():
with open('tests/images/tester.jpg', 'rb') as img1:
responses.add(responses.GET, 'http://example.org/images/my_image.jpg',
body=img1.read(), status=200,
content_type='image/jpeg')
#...
但此時代碼正在測試提出了這一點:
I/O operation on closed file.
當然圖像仍然應該是with
內開放塊?
更新3:
r = requests.get(url, stream=True)
if r.status_code == 200:
with open('/tmp/temp.jpg', 'wb') as f:
r.raw.decode_content = True
shutil.copyfileobj(r.raw, f)
這似乎是最終shutil
線正在生成:我測試的代碼是這樣的「關於關閉的文件I/O操作。」錯誤。我不明白這足夠 - 文件的流 - 知道如何最好地嘲笑這種行爲,測試下載的文件被保存到/tmp/
。
這有幫助嗎? http://stackoverflow.com/a/26364642/2776376 –
'body = open(filename,'rb')。read()'不工作?在實踐中,與任何「打開」調用一樣,您可能希望將其用作上下文管理器。 –
謝謝雙方......我已經提出了兩個建議,但尚未完成! –