2016-01-04 57 views
0

嘲笑的urllib2我遇到过类似的问题,Mocking urllib2.urlopen().read() for different responses如何使用标准的模拟库

但解决不适合我。

当我想模拟urlopen对象时,我的模拟对象总是返回<MagicMock name='urlopen().read()' id='140016097869776'>

这里是我想测试一下,mod.py

import urllib2 
from zipfile import ZipFile 
from io import BytesIO 
def verify(url, checksum): 
    try: 
     conn = urllib2.urlopen(url) 
     byte = conn.read() 
     conn.close()   
     myzip = ZipFile(BytesIO(byte)) 
    except Exception as e: 
     err = get_error(400, "Not a valid zip format: %s" % (str(e))) 
     return Response(err, status=status.HTTP_400_BAD_REQUEST) 
    return byte 

这里是我的讥笑

@mock.patch('mod.urllib2.urlopen') 
@mock.patch('mod.ZipFile') 
@mock.patch('mod.BytesIO') 
def test_verify(self, urlopen_mock, zipfile_mock, bytesio_mock): 
    conn = mock.Mock() 
    conn.read.return_value = 'byte' 
    urlopen_mock.return_value = conn 
    zf = mock.Mock() 
    zipfile_mock.return_value = zf 
    assertEqual(verify('url','checksum'), 'byte') 

但是,返回的字节总是<MagicMock name='urlopen().read()' id='140016097869776'>,不'byte'我嘲笑。

我错过了什么重要的事情?

回答

1

您需要在康涅狄格州的返回值定义read

conn.return_value.read.return_value = 'byte' 

编辑我误诊问题。实际的问题是,该方法的参数以相反的顺序传递给应用的装饰方式:所以你的签名应该是:

def test_verify(self, bytesio_mock, zipfile_mock, urlopen_mock): 
+0

这并不为我工作。 –