考虑以下 Python 代码:
elif request.method == 'DELETE':
try:
os.remove(full_file)
return jsonify({'results':'purged %s' % full_file})
except OSError as e:
if e.errno != errno.ENOENT:
raise
return jsonify({'results':'file not present: %s' % full_file})
我想测试所有可能的路径,包括异常处理。使用Mock库,使用以下代码很容易地raise一个异常:
with patch('os.remove', new=Mock(side_effect=OSError(errno.ENOENT))):
self.assertRaises(OSError, self.app.delete, file_URL) # broken
Mock引发了异常,其打印值为2(ENOENT),但e.errno被设置为NONE。到目前为止,我还没有找到一种设置它的方法。结果是,异常总是被重新引发,并且我永远无法达到单元测试中的最后一行代码。我还尝试创建具有设置errno的虚拟类,并返回该类。但是,除非将side_effect设置为要调用,否则它不会引发异常,当我设置side_effect时,我不会得到object.errno作为返回值。
是否有一种方法可以使Mock引发一个具有errno属性设置的异常对象?
args
属性。 - falsetruargs
是errno
的?我看了一下,它只是一个元组。 - John Cargs
是传递给异常构造函数的参数元组。 - falsetruexceptions
模块文档中的args
。 - falsetruerrno
。谢谢,这是一次学习经历。 - John C