问题描述
我正在尝试使用带有JSON映射的wiremock独立测试JS应用程序的不同提取失败方案。
try {
const response = await fetch('/api',options); // 1
if (response.ok) {
// do something with a successful response
} else {
throw new Error('response not ok'); // 2
}
} catch (error) {
// log the error // 3
}
当我根据wiremock文档simulate bad response failures进行操作时,它在获取调用(1)失败并触发捕获(3)。
{
"request": {
"urlPath": "/api","method": "ANY"
},"response": {
"fault": "RANDOM_DATA_THEN_CLOSE"
"headers": {
"Content-Type": "application/json; charset=utf-8","Access-Control-Allow-Origin": "http://localhost:8080","Access-Control-Allow-Methods": "PUT","Access-Control-Allow-Headers": "x-csrf-token,content-type,pragma,cache-control","Access-Control-Allow-Credentials": "true","X-Content-Type-Options": "nosniff","x-frame-options": "DENY","x-xss-protection": "1; mode=block"
}
}
}
根据MDN docs response.ok是只读的布尔2XX,但是如果我将状态设置为408,则response.ok仍然为真。
{
"request": {
"urlPath": "/api","response": {
"status": 408,"jsonBody": {},"headers": {
"Content-Type": "application/json; charset=utf-8",...
}
}
}
我还没有发现状态代码/故障与wiremock的组合实际触发!response.ok错误(2)。我们正在从用户界面将日志发送到生产服务器,这告诉我们!response.ok分支已被命中。
解决方法
来自fetch MDN:
仅当遇到网络错误时,fetch()承诺才会拒绝 (通常是在出现权限问题或类似问题时)。一种 fetch()承诺不会拒绝HTTP错误(404等)。相反, then()处理函数必须检查Response.ok和/或Response.status 属性。
因此,要达到response.ok === false
,最简单的测试是针对未知的URL
调用它,以强制服务器返回404
。
例如,让我们使用SO
和这个问题来测试此功能。您可以按以下方式获取它:
async function fetchMe() {
let resp = await fetch("https://stackoverflow.com/questions/64319800");
if (resp.ok) {
console.log("Question exists!");
} else {
console.log("Question does not exist!");
}
};
fetchMe();
当我们在URL
的末尾添加一些文本时,SO
应该返回404
:
async function fetchUnknown() {
let resp = await fetch("https://stackoverflow.com/questions/64319800UNKNOWN");
if (resp.ok) {
console.log("Question exists!");
} else {
console.log("Question does not exist!");
}
};
fetchUnknown();