关于单元测试:如何使用Python Mock引发异常 – 但将Errno设置为给定值

How to use Python Mock to raise an exception - but with Errno set to a given value

鉴于此Python代码:

1
2
3
4
5
6
7
8
9
10
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,很容易引发异常,我使用此代码:

1
2
with patch('os.remove', new=Mock(side_effect=OSError(errno.ENOENT))):
    self.assertRaises(OSError, self.app.delete, file_URL) # broken

模拟引发异常,其打印值为2(ENOENT) - 但e.errno设置为NONE。 到目前为止,我还没有找到一种方法来设置它。 结果是,异常总是被重新引发,我的单元测试中从未到达最后一行代码。

我也尝试使用errno set创建一个虚拟类,然后返回它。 但除非它有* side_effect *设置为调用,否则它不会引发异常,当我设置side_effect时,我不会将object.errno作为返回值。

有没有办法让Mock引发一个Exception,那个Exception对象是否设置了errno属性?


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

例如:

1
2
3
4
5
>>> OSError(2).errno
>>> OSError(2, 'message').errno
2
>>> OSError(2, 'message').strerror
'message'