如何使用Python Mock引发异常 - 但Errno设置为给定值

Joh*_*n C 9 python unit-testing mocking

鉴于此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})
Run Code Online (Sandbox Code Playgroud)

我想测试所有可能的路径,包括异常处理.使用Mock,很容易引发异常,我使用此代码:

with patch('os.remove', new=Mock(side_effect=OSError(errno.ENOENT))):
    self.assertRaises(OSError, self.app.delete, file_URL) # broken
Run Code Online (Sandbox Code Playgroud)

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

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

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

fal*_*tru 9

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

例如:

>>> OSError(2).errno
>>> OSError(2, 'message').errno
2
>>> OSError(2, 'message').strerror
'message'
Run Code Online (Sandbox Code Playgroud)