Wiremock独立JSON response.ok等于从未达到的错误

问题描述

我正在尝试使用带有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();