Python 请求:断言 status_code 没有失败

klr*_*her 1 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
Run Code Online (Sandbox Code Playgroud)

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

如何测试 status_code 是否不是特定值?

Mar*_*ers 5

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

用于==测试是否相同:

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

assert addresses.status_code != 403
assert addresses.status_code != codes.forbidden
assert addresses.status_code == codes.ok
Run Code Online (Sandbox Code Playgroud)

或者只是使用

addresses.raise_for_status()  # raises an exception if not 1xx, 2xx or 3xx
Run Code Online (Sandbox Code Playgroud)

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

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