为什么_this.debug不是此测试中的函数



我正在为一个项目开发概念验证。我使用Node.js和express.js,并尝试使用jest.js对其进行单元测试。这是一个简单的API,返回一条简单的硬编码消息。

我的意图是测试调试日志中的消息";健康检查";当调用路由时。

我在以下单元测试中遇到了问题(我知道我的测试中没有断言,一旦测试通过,这将是下一步(:

失败应用程序/测试/服务器/路由/健康检查/HealthCheck.test.js(24.196秒(

●功能#1:记录运行状况检查请求›whenRouting_thenDebugShouldSendTheRouteMessage

TypeError: _this.debug is not a function
7 |         this.router = router;
8 |         this.route = (request, response) => {
>  9 |             this.debug('Health check');
|                  ^
10 |             response.send({"Health check": "Passed!"});
11 |         }
12 |     }
at HealthCheck.route (app/server/routes/health-check/HealthCheck.js:9:18)
at Object.<anonymous> (app/tests/server/routes/health-check/HealthCheck.test.js:35:21)

我怀疑debug没有绑定到测试实例。我应该如何着手解决这个问题?

此外,当我运行代码时,一切都很好。

这是我的测试课程:

import HealthCheck, {ROUTE_NAME} from "../../../../server/routes/health-check/HealthCheck";
import debug from 'debug';
import express from "express";
jest.mock('debug');
const extendMock = jest.fn();
const requestMock = jest.fn();
const responseMock = jest.fn(() => {
return {
send: jest.fn()
};
});

debug.extend = extendMock;
let healthCheck;
describe('Feature #1: Logging health check request', () => {
beforeEach(() => {
setup();
});
test('whenBuildingRoute_thenDebugShouldExtendWithTheRouteName', () => {
expect(debug.extend.mock.calls[0][0]).toBe(ROUTE_NAME);
});
test('whenCreatingRoute_thenTheRouterShouldBeReturned', () => {
let router = healthCheck.create();
expect(router).toBe(express);
});
test('whenRouting_thenDebugShouldSendTheRouteMessage', () => {
healthCheck.route(requestMock, responseMock);
});
});
function setup() {
express.mockClear();
debug.mockClear();
extendMock.mockClear();
requestMock.mockClear();
responseMock.mockClear();
healthCheck = new HealthCheck(express, debug);
}

这是我试图测试的类:

export const ROUTE_PATH = "/health-check";
export const ROUTE_NAME = "health-check";
export default class HealthCheck {
constructor(router, debug) {
this.debug = debug.extend(ROUTE_NAME);
this.router = router;
this.route = (request, response) => {
this.debug('Health check');
response.send({"Health check": "Passed!"});
}
}
create() {
this.router.get(ROUTE_PATH, this.route);
return this.router;
}
}

这里还有一个测试类,我已经有了,所有的测试都通过了,我不明白有什么不同。

import LoggingMiddleware, {
BUILDING_MIDDLEWARE_MESSAGE, HTTP_REQUEST_MESSAGE,
MIDDLEWARE_NAME
} from "../../../server/middlewares/LoggingMiddleware";
import express from 'express';
import debug from 'debug';
import {expressMockListen, expressMockUse} from "../../../../__mocks__/express";
jest.mock('debug');
const REQUEST_METHOD = "A method";
const requestMock = jest.fn(()=>{
return {
method: REQUEST_METHOD,
path: jest.fn(),
headers: jest.fn(),
query: jest.fn(),
body: jest.fn()
}
});
const responseMock = jest.fn();
const nextMock = jest.fn();
let loggingMiddleware;
describe('Feature #1: Logging HTTP requests', () => {
beforeEach(() => {
setup();
});
test('whenBuildingAMiddleware_thenTheLoggerShouldDebugAMessage', () => {
expect(debug.mock.calls[0][0]).toBe(BUILDING_MIDDLEWARE_MESSAGE);
});
test('whenGettingName_thenTheNameShouldBeReturned', () => {
expect(loggingMiddleware.getName()).toBe(MIDDLEWARE_NAME);
});
test('whenGettingTheMiddlewareFunction_thenExpressUseShouldBeCalled', () => {
loggingMiddleware.getMiddlewareFunction();
expect(expressMockUse).toHaveBeenCalled();
});
test('whenGettingTheMiddlewareFunction_thenExpressRouterShouldBeReturned', () => {
const router = loggingMiddleware.getMiddlewareFunction();
expect(router).toBe(express);
});
test('whenLogging_thenNextShouldBeCalled', () => {
loggingMiddleware.log(requestMock, responseMock, nextMock);
expect(nextMock).toHaveBeenCalled();
});
test('whenLogging_thenTheMessageShouldBeLogged', () => {
loggingMiddleware.log(requestMock, responseMock, nextMock);
expect(debug.mock.calls[1][0]).toBe(HTTP_REQUEST_MESSAGE);
});
});
function setup() {
express.mockClear();
expressMockUse.mockClear();
expressMockListen.mockClear();
debug.mockClear();
requestMock.mockClear();
responseMock.mockClear();
nextMock.mockClear();
loggingMiddleware = new LoggingMiddleware(express, debug);
}

extendMock是一个存根,因此模拟的debug.extend返回undefined而不是函数。

如果模块需要更具体的mock,则需要用手动mock替换自动mock。debug.extend可以通过导出公开的一个函数,以便在测试中直接访问:

import debug, { mockDebugInstance } from 'debug';
jest.mock('debug', () => {
const mockDebugInstance = jest.fn();
const mockDebug = jest.fn().mockReturnValue({
extend: jest.fn().mockReturnValue(mockDebugInstance);
};
return {
__esModule: true,
default: mockDebug,
mockDebugInstance
};
});
...
expect(debug.extend).toBeCalledWith(...);
expect(mockDebugInstance).toBeCalledWith(...);

最新更新