如何使用Python Mock来引发异常,但同时将Errno设置为给定值?

11

考虑以下 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属性设置的异常对象?
1个回答

11
< p >传递两个参数给 OSError 构造函数(第一个参数应该是errno)。

例如:


例如:
>>> OSError(2).errno
>>> OSError(2, 'message').errno
2
>>> OSError(2, 'message').strerror
'message'

1
哇,这太快了 - 而且正确。 :) 这是在 Python 的异常文档中吗?我确实读过那些,但可能错过了什么。 - John C
@JohnC,我故意引发了OSError并检查了异常对象的args属性。 - falsetru
有趣 - 你是怎么判断其中一个argserrno的?我看了一下,它只是一个元组。 - John C
@JohnC,args是传递给异常构造函数的参数元组。 - falsetru
@JohnC,请查看exceptions模块文档中的args - falsetru
啊,我一直在看OSError,但应该跟进到EnvironmentError,他们在那里更详细地解释了errno。谢谢,这是一次学习经历。 - John C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接