Python请求:断言status_code没有失败

时间:2018-05-04 18:40:50

标签: python python-requests

如果api调用返回403代码,我试图使用特定错误消息进行测试失败。我尝试过几个选项:

if int(addresses.status_code) is 403:
    fail("Auth Error: Missing Role {}".format(response.json()))

assert addresses.status_code is not 403

assert addresses.status_code is not codes.forbidden

assert addresses.status_code is codes.ok

失败的唯一一个是最后一个assert addresses.status_code is codes.ok。但是,api调用使用响应的状态代码是 403.我已经确定类型是相同的等等,但不知道还能去哪里。

如何测试status_code不是特定值?

2 个答案:

答案 0 :(得分:3)

is测试身份。状态代码确实与403codes.forbidden不同。状态值是整数,而不是单例枚举对象。

使用==来测试是否相同:

if addresses.status_code == 403:
    # ...

assert addresses.status_code != 403
assert addresses.status_code != codes.forbidden
assert addresses.status_code == codes.ok

或只是使用

addresses.raise_for_status()  # raises an exception if not 1xx, 2xx or 3xx

Response.raise_for_status() method引发了requests.exceptions.HTTPError异常(requests.exceptions.RequestException的子类,又是OSError子类。)

请注意,有时 is将使用整数或任意数量的其他类型。但是,除非有特定的文档可以使用身份测试,否则您已经找到了一个实现细节,其中Python将出于性能原因重新使用对象。小整数(从-5到256)就是这种情况,在某些情况下也是如此,以及许多其他角落情况。所以address.status_code is 200恰好在当前的CPython解释器中工作,但这不是给定的,不应该依赖

答案 1 :(得分:0)

您正在使用is,它会检查两个对象的身份。要比较int,您应该使用==。事实上,除了检查单身人士(例如==)或实际需要时,总是使用None