簡體   English   中英

測試多個路由導致 Jest 模擬 function 未定義

[英]Testing multiple routes causes Jest mocked function to be undefined

我想知道在 expressJS 中開玩笑地測試多條路線的最佳方法。

我當前的問題是當我嘗試測試使用相同模擬 function 的多條路由時,最后一條路由拋出未定義的錯誤。

這是代碼中的上下文。

應用程序.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;

控制器/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);
      });
  });
});

測試/two.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 referencing this line const result = await db.query(sql)

當我切換 controller 導入時

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

然后test/two.ts通過並且test/one.ts失敗並出現相同的錯誤。 我還想提一下,無論是否重置 jest mock,我都會得到相同的結果。

這可能與您在測試結束時沒有調用完成這一事實有關。 在測試的預期部分內,調用done() 您還需要更改回調,使其像這樣:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM