我有这个演示函数:
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');