【问题标题】:How to test mongodb database with mocha and chai?如何用 mocha 和 chai 测试 mongodb 数据库?
【发布时间】:2021-07-01 09:06:09
【问题描述】:

我正在尝试通过 mongoose 测试与 mongodb 数据库交互的 api 路由。我的测试工具是 chai 和 mocha。每次测试都会因为超时错误而失败。

错误:超过 2000 毫秒的超时。对于异步测试和钩子,确保调用“done()”;如果返回一个 Promise,请确保它解析。

路由被正确调用,函数findUserById也被调用。但是,我注意到findUserById 在服务器连接到 mongodb 之前被调用!

如何解决这个问题?

这是应用程序文件:

require("dotenv").config();
import express from "express";
import bodyParser from "body-parser";
import compression from "compression";
import cookieParser from "cookie-parser";
import rateLimit from "express-rate-limit";
import cors from "cors";
import { createServer } from "http";
import { Server } from "socket.io";
import searchRouter from "./routers/search";
import { SocketControler } from "./controllers/socket";

// Server
export const app = express();
const server = createServer(app);
const io = new Server(server);

// Middleware
app.use(cors({ credentials: true, origin: [process.env.CLIENT as string] }));
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(compression());
app.use(cookieParser());
app.use(rateLimit({ max: 100})); // limit each IP to 20 requests per minute
SocketControler.manageEvents(io);

// Routers
app.use(searchRouter);
app.locals.io = io;

// Start
connectToDatabase()
  .then(() =>
    server.listen(process.env.PORT, () =>
      console.log(`server is listening on ${process.env.PORT}!`)
    )
  )
  .catch((err) => console.log("error", err));

路线是:

interface GetUser extends Request {
  params: {
    id: string;
  };
}

interface IResponse extends Response {
  user: UserLean;
}

const getUser = async (
  req: GetUser,
  res: IResponse
): Promise<IResponse> => {
  try {
    const user = await UserControler.findUserById(req.params.id);
    return res.status(200).json({ user });
  } catch (err) {
    throw new Error("error.unknown");
  }
};

export default getUser;

控制器功能:

  static findUserById(id: string) {
    return UserDB.findById({ _id: id }).lean();
  }

connectToDatabase 函数:

import Mongoose from "mongoose";

export default async function connectToDatabase() {
  try {
    return Mongoose.connect(process.env.MONGODB as string, {
      useFindAndModify: false,
      useNewUrlParser: true,
      useUnifiedTopology: true,
      useCreateIndex: true,
      autoIndex: false,
    });
  } catch (err) {
    throw new Error(err);
  }
}

还有测试文件:

import chai from "chai";
import chaiHttp from "chai-http";
import { app } from "../index";

chai.use(chaiHttp);
const api = chai.request(app).keepOpen();

describe("GET /user/:id", () => {
  it("return user information", (done) => {
    api
      .get("/user/123")
      .end((err, res) => {
        chai.expect(res).to.have.status(200);
        done();
      });
  });
});

我该如何解决这个问题?

【问题讨论】:

    标签: node.js mongodb express mongoose mocha.js


    【解决方案1】:

    这就是我们的做法:

    首先,我们像您在connectToDatabase() 中一样创建了数据库连接,然后我们为我们的测试创建了一个before 挂钩:

    before(async () => {
       await connectToDatabase();
       //... any other setup code that needs to occur
    });
    

    这可确保在运行测试之前发生 db 连接。

    【讨论】:

      【解决方案2】:

      问题是无法读取 process.env.MONGODB。我需要添加 require("dotenv").config();在 connectToDatabase.ts 文件的顶部。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-27
        • 1970-01-01
        • 1970-01-01
        • 2017-03-19
        • 2015-12-01
        • 2013-04-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多