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构造函数。 (第一个应该是
例如:
1 2 3 4 5 | >>> OSError(2).errno >>> OSError(2, 'message').errno 2 >>> OSError(2, 'message').strerror 'message' |