提问者:小点点

超时异步回调测试与 Sinon Jest 超级测试,以模拟快速 API 上的错误 500


我正在测试一个包含所有超文本传输协议500错误的api。

在这里,我尝试使用sinon.stub在一个失败的服务器上进行测试,并得到一个500错误,但我得到了一个timeOut异步回调,或者如果我使用我的应用程序,则会得到一个成功的200响应状态。我一定错过了什么,我被卡住了。。。

你会在下面看到一个可怕的错误吗?

谢谢你的宝贵帮助

process.env.NODE_ENV = "test";
const app = require("../../app");
const request = require("supertest");
const sinon = require("sinon");
// /************************** */
const usersRoute = require("../../routes/Users");
const express = require("express");

const initUsers = () => {
  const app = express();
  app.use(usersRoute);
  return app;
};

describe("all 5xx errors tested with stub", function () {
  it("should return a 500 when an error is encountered", async (done) => {
    let secondApp;

    sinon.stub(usersRoute, "post").throws(
      new Error({
        response: { status: 500, data: { message: "failed" } },
      })
    );
    secondApp = initUsers(); //==========> Timeout Async Callback
    //secondApp = require("../../app"); //==============> gives a 200 instead of 500
    const fiveHundredError = await request(secondApp)
      .post("/users/oauth?grant_type=client_credentials")
      .send({
        username: "digitalAccount",
        password: "clientSecret",
      });

    expect(fiveHundredError.statusCode).toBe(500); 
    //sinon.restore();
    done();
  });
});

应用程序正在使用快递。路由器获取用户路由:

const express = require("express");
const router = express.Router();
const axios = require("axios");

router.post("/users/oauth", async (req, res) => {
  //if (all missing parts)
  //else {
    try {

      if (req.fields) {
        const response = await axios.post(
          `${base_url}oauth/token?grant_type=${req.query.grant_type}`,
          {},
          {
            auth: {
              username: req.fields.username,
              password: req.fields.password,
            },
          }
        );
        res.json(response.data);
      }
    } catch (error) {
      return res.status(error.response.status).json(error.response.data);
    }
  }
});

module.exports = router;

见server.js:

const app = require("./app");

const port = process.env.PORT || 5000;

app.listen(port, () => console.log(`server starting on port ${port}!`));

和app.js:

// private environment:
require("dotenv").config();
const express = require("express");
const formidableMiddleware = require("express-formidable");
const cors = require("cors");


const app = express();

app.use(formidableMiddleware());
app.use(cors());

const usersRoute = require("./routes/Users");
app.use(usersRoute);

app.get("/", (req, res) => {
  res.status(200).send("Welcome to Spark Admin back end!");
});

app.all("*", (req, res) => {
  return res.status(404).json({ error: "Web url not found" });
});

module.exports = app;

共1个答案

匿名用户

我最终选择了“nock”并删除了“sinon”

const nock = require("nock");
const axios = require("axios");

describe("POST login: all 5xx errors tested with nock", function () {
  it("should return a 500 when an error is encountered", async (done) => {
    const scope = nock("http://localhost:5000")
      
      .post(
        "/users/oauth",
        {},
        {
          username: "blibli",
          password: "blabla",
        }
      )
      .reply(500, {
        response: {
          statusCode: 500,
          body: { error: "AN ERROR OCCURED" },
        },
      });
    try {
      await axios.post(
        "http://localhost:5000/users/oauth",
        {},
        {
          username: "blibli",
          password: "blabla",
        }
      );
    } catch (e) {
      expect(e.response.status).toBe(500);
    }
    done();
  });
});

相关问题