如何使用 Jest 单元测试检查正在运行的函数中间的预期日志?



我有这个演示函数:

export async function myHandler(
param1: string,
param2: string,
req: Request,
next: NextFunction,
) {
const log = req.log.prefix(`[my=prefix]`);
let res;
If (param1 === 'param1') {
log("GOT PARAM 1");
} else {
res = await doSomething();
}
log("GOT HERE");
..
..
..
..
res.setReturnStatus(200)
}
next();
}

关于记录器,这是包含它的请求:

const req: {
url: string;
params: {};
body: {
device: {
type: string;
p1: string;
p2: string;
p3: string;
};
data: {
sample: number;
};
};
metric: () => jest.Mock<any, any>;
log: {
(): jest.Mock<any, any>;
warn(): jest.Mock<...>;
error(): jest.Mock<...>;
prefix(): jest.Mock<...>;
};
timing: () => jest.Mock<...>;

}

当我编写单元测试时,我的行正在检查返回状态:expect(res.status).toBeCalledWith(200);

我想涵盖第一个"if"语句,该语句记录"GOT PARAM 1",但无法弄清楚如何在中间拦截我的调用。

doSomething = jest.fn(() => Promise.resolve());
await myHandler('param1', 'param1', next); //HERE to check somehow that also was log ?
expect(res.status).toBeCalledWith(200);

尝试做类似的事情:

const spy = jest.spyOn(req.log, 'log');

收到错误:

Cannot spy the log property because it is not a function; undefined given instead

由于log源自req,模拟实现应该通过它:

let mockLog = jest.fn();
let mockReq = { log: { prefix: jest.fn().mockReturnValue(mockLog) } };
await myHandler('param1', 'param1', mockReq, next);
expect(mockReq.log.prefix).toBeCalledWith(...);
expect(mockLog).toBeCalledWith(...);

此尝试失败,因为它是req.log.prefix,而不是req.log.log

const spy = jest.spyOn(req.log, 'log');

最新更新