簡體   English   中英

用 Jest 模擬 express.Router()

[英]Mock express.Router() with Jest

在我測試的代碼中,我想模擬router

import * as express from "express";

const router = express.Router();    // I want to mock this
router.route(...).post(...);
router.route(...).get(...);

在我的測試中:

import * as express from "express";

test("foo", () => {
  jest.mock("express", () => {
    Router: () => jest.fn()
  });
  // ...test stuff
});

但這不起作用。 我究竟做錯了什么?

模塊模擬應該在導入之前。 如果這種情況發生在頂層babel-jest轉換會自動將jest.mock放在import之上。 如果jest.mock嵌套,則不會發生這種情況。

它應該是:

import * as express from "express";

jest.mock("express", () => {
  Router: () => jest.fn()
});

...

或者:

test("foo", () => {
  jest.mock("express", () => {
    Router: () => jest.fn()
  });

  const express = require('express');
  // ...test stuff
});

我使用了@Estus Flask 示例並將其組合成一個整體。

route/site/index.js

const express = require('express')
const router = express.Router()

const controller = require('../../controller').site

/*
 * Site APIs.
 */

router.get('/', controller.getAll)

module.exports = router

route/site/test/siteRoute.test.js

const siteRouter = require('../')

jest.mock('../../../controller')
jest.mock('express', () => ({
  Router: () => ({
    get: jest.fn(),
  }),
}))

describe('[Router] Site Test', () => {
  test('Exports get with getAll', () => {
    const controller = require('../../../controller').site
    expect(siteRouter.get).toHaveBeenCalledWith('/', controller.getAll)
  })
})

controller/__mocks__/index.js

const site = {
  getAll: jest.fn(),
}

module.exports = {
  site,
}

暫無
暫無

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

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