0

我真的不知道该如何表达我的问题。但我可以解释发生了什么。

server.js(受影响的路由定义)

app.get("/api/users/:id", users.getUser);

users.js(用户路由文件)

getUser: asyncMiddleware(async (req, res, next) => {
  const { data } = await axios.get(
    `https://jsonplaceholder.typicode.com/users/${req.params.id}`
  );
  const userData = pruneData([data]);
  res.status(200).json(userData);
})

asyncMiddleware.js(捕获异步错误)

const asyncMiddleware = fn => (req, res, next) => {
  Promise.resolve(fn(req, res, next)).catch(next);
};

export default asyncMiddleware;

users.test.js

import chai from "chai";
import chaiHttp from "chai-http";
import app from "../../src/server/server";

const expect = chai.expect;
chai.use(chaiHttp);

describe("Users API tests", () => {
  it("should return a 500 server error", done => {
    chai
      .request(app)
      .get("/api/users/11") // outside the range or contacts
      .end((err, res) => {
        expect(res).to.have.status(404);
        done();
      });
  });
});

测试输出

Error: Request failed with status code 404
    at createError (/Users/XXXX/node_modules/axios/lib/core/createError.js:16:15)
    at settle (/Users/XXXX/node_modules/axios/lib/core/settle.js:17:12)
    at IncomingMessage.handleStreamEnd (/Users/XXXX/node_modules/axios/lib/adapters/http.js:237:11)
    at IncomingMessage.emit (events.js:205:15)
    at endReadableNT (_stream_readable.js:1154:12)
    at processTicksAndRejections (internal/process/task_queues.js:84:9)
    1) should return a 500 server error

    1 failing

    1) Users API tests
    should return a 500 server error:

    Uncaught AssertionError: expected { Object (_events, _eventsCount, ...) } to have status code 404 but got 500
    + expected - actual

    -500
    +404

    at status (tests/routes/users.test.js:43:29)
    at Test.Request.callback (node_modules/superagent/lib/node/index.js:716:12)
    at IncomingMessage.<anonymous> (node_modules/superagent/lib/node/index.js:916:18)
    at endReadableNT (_stream_readable.js:1154:12)
    at processTicksAndRejections (internal/process/task_queues.js:84:9)

jsonplaceholder.typicode.com当您提供超出范围的 id 时,网站实际返回的响应状态为 404。这就是 404 的来源,但为什么测试没有捕捉到它,而是从我自己的服务器发送 500?

如果我更改测试以检查状态 500,所有测试都通过,但我仍然Error: Request failed with status code 404在测试输出中。

顺便说一句 - 我还有 10 个其他测试通过,没有任何问题,这是迄今为止我的套件中唯一的一个。

4

1 回答 1

0

好的,由于某种原因,我在异步调用周围的 asyncMiddleware 没有正确返回。

我已经开始使用 try/catch 方法并从 err.response 发送状态,它似乎正在工作。

getUser: async (req, res, next) => {
  try {
    const { data } = await axios.get(
      `https://jsonplaceholder.typicode.com/users/${req.params.id}`
    );
    const userData = pruneData([data]);
    res.status(200).json(userData);
  } catch (err) {
    res.status(err.response.status).json({ err });
  }
}

现在实际上返回 404。

于 2019-08-04T22:04:38.457 回答