【问题标题】:Testing multiple routes causes Jest mocked function to be undefined测试多个路由会导致 Jest 模拟函数未定义
【发布时间】:2021-08-22 13:24:25
【问题描述】:

我想知道用 jest 在 expressJS 中测试多个路由的最佳方法。

我当前的问题是,当我尝试测试使用相同模拟函数的多个路由时,最后一个路由会引发未定义的错误。

这是代码中的上下文。

app.ts

import * as express from "express";
import controllerOne from "./controllers/one";
import controllerTwo from "./controllers/two";

const app = express();

app.use("/one", controllerOne);
app.use("/two", controllerTwo);

export default app;

控制器/one.ts

import getDbConnection from "../db";
import * as express from "express";

const router = express.Router();

const db = getDbConnection();

router.get("/", async (_, res) => {
  const sql = "SELECT * from table";

  const result = await db.query(sql);

  res.status(200).json(result);
});

export default router;

controllers/two.ts

import getDbConnection from "../db";
import * as express from "express";

const router = express.Router();

const db = getDbConnection();

router.get("/", async (_, res) => {
  const sql = "SELECT * from table";

  const result = await db.query(sql);

  res.status(200).json(result);
});

export default router;

测试/one.ts

import * as request from "supertest";
import { mocked } from "ts-jest/utils";
import db from "../db";

jest.mock("../db");

const mockedDB = mocked(db);

const data = ["data"];

describe("Controller One", () => {
  afterAll(() => {
    jest.restoreAllMocks();
    jest.resetModules();
  });

  beforeEach(() => {
    const mockedQueryFn = {
      query: jest.fn().mockResolvedValueOnce(data),
    };

    mockedDB.mockReturnValueOnce(mockedQueryFn);
  });

  it("should retrieve one", async () => {
    const mod = require("../src/app");
    const app = (mod as any).default;

    await request(app)
      .get("/one")
      .expect(200)
      .expect(function (res) {
        expect(res.body).toEqual(data);
      });
  });
});

测试/两个.ts

import * as request from "supertest";
import { mocked } from "ts-jest/utils";
import db from "../db";

jest.mock("../db");

const mockedDB = mocked(db);

const data = ["data"];

describe("Controller One", () => {
  afterAll(() => {
    jest.restoreAllMocks();
    jest.resetModules();
  });

  beforeEach(() => {
    const mockedQueryFn = {
      query: jest.fn().mockResolvedValueOnce(data),
    };

    mockedDB.mockReturnValueOnce(mockedQueryFn);
  });

  it("should retrieve one", async () => {
    const mod = require("../src/app");
    const app = (mod as any).default;

    await request(app)
      .get("/two")
      .expect(200)
      .expect(function (res) {
        expect(res.body).toEqual(data);
      });
  });
});

现在我的问题是,如果我运行测试,test/one.ts 将通过 test/two.ts 将失败,并出现错误 TypeError: Cannot read property 'query' of undefined 引用此行 const result = await db.query(sql)

当我打开控制器导入时

import controllerTwo from "./controllers/two";
import controllerOne from "./controllers/one";

然后test/two.ts 通过并且test/one.ts 失败并出现相同的错误。 我还想提一下,无论是否重置 jest mock,我都会得到相同的结果。

【问题讨论】:

    标签: node.js unit-testing jestjs ts-jest


    【解决方案1】:

    这可能与您在测试结束时没有调用 done 的事实有关。在测试的期望部分,调用done()。您还需要更改回调,使其如下所示:

    it("should retrieve one", async (done) => {
    

    【讨论】:

      猜你喜欢
      • 2019-06-18
      • 1970-01-01
      • 2021-03-03
      • 2019-07-08
      • 1970-01-01
      • 2018-09-09
      • 2020-02-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多