Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 测试400状态代码axios时抛出错误_Javascript_Testing_Axios_Web Api Testing - Fatal编程技术网

Javascript 测试400状态代码axios时抛出错误

Javascript 测试400状态代码axios时抛出错误,javascript,testing,axios,web-api-testing,Javascript,Testing,Axios,Web Api Testing,我正在为我正在从事的一个项目创建一个api测试框架,并希望验证发送到端点的JSON对象中的必填字段 我正在尝试发送一个缺少字段的JSON对象,并期望应用程序发出400个带有验证消息的响应。但是,当使用axios进行此调用时,它(有点正确地)在收到400时抛出一个错误 我希望能够断言400是预期值,并在验证消息上断言 我遇到的所有例子都是关于以正确的方式处理400响应的,如果你不期望400响应,但我期望它 我似乎找不到其他人在尝试这个 async function createReminder(r

我正在为我正在从事的一个项目创建一个api测试框架,并希望验证发送到端点的JSON对象中的必填字段

我正在尝试发送一个缺少字段的JSON对象,并期望应用程序发出400个带有验证消息的响应。但是,当使用axios进行此调用时,它(有点正确地)在收到400时抛出一个错误

我希望能够断言400是预期值,并在验证消息上断言

我遇到的所有例子都是关于以正确的方式处理400响应的,如果你不期望400响应,但我期望它

我似乎找不到其他人在尝试这个

async function createReminder(reminderObject) {
  const response = await axios.post(`${config.get('baseUrl')}/reminder`, {
    ...reminderObject
  });

  return response;
}

module.exports.createReminder = createReminder;
这是我目前的工作代码。当与有效呼叫一起使用时,这将产生有效的200

我需要在调用此函数的函数中处理的响应对象中返回400响应/验证消息。

实际上,您希望截获响应并根据需要进行转换。有一个专用于拦截器的。下面是我在最近的一个项目中使用的Laravel后端的例子,说明了如何使用它:

axios.interceptors.response.use(
  res => Promise.resolve(res.data),
  error => {
    let message = null;
    if (error.response) {
      // if error has a data.error property, it's an error formatted by server
      if (error.response.data.error) message = error.response.data.error;
      else if (error.response.status === 500) message = 'Oops! Something went wrong.';
    } else {
      // if error has a code property, it's an error defined by axios
      if (error.code === 'ECONNABORTED') message = 'Timeout exceeded';
      else message = 'Oops! Something went wrong.';
    }
    // eslint-disable-next-line prefer-promise-reject-errors
    return Promise.reject({ error: message });
  }
);
上面的代码允许我按如下方式进行axios调用,并且始终使用相同的格式:

axios.post('/url', { data: { ... }})
  .then(({ jsonProp1 }) => console.log(jsonProp1))
  .catch(({ error }) => console.log(error);

注意:如果您确实创建了一个新的axios实例,您也需要为该实例重新注入响应拦截器。

谢谢。我确实在文档中看到了这一点,但我并不真正理解如何实现它。我应该将拦截器的代码放在哪里?@Kpizzle在导入axios之后,您可以确保所有后续AJAX调用都将使用它。例如,我通常创建一个api.js文件并将此代码放在其中,因此在require语句之后添加意味着在进行任何api调用之前将调用拦截器。但是,如果我像你建议的那样将代码放在另一个文件中,那么我该如何调用它呢?这看起来是正确的方法。你不需要显式地调用它。您只需在任意位置导入axios(它导出一个默认实例,并且您已经在其上注册了一个拦截器,因此它将自动为每个请求响应执行)。如果您不熟悉,请搜索术语中间件,axios拦截器的工作原理与Express js或任何类型的中间件非常相似,这很有意义,是的,我了解中间件。非常感谢你。现在让我尝试添加这一点。