开玩笑嘲笑 request.res.setHeader 总是 return 错误 - 不是函数
Jest mocking request.res.setHeader always return error - not a function
我的登录方法使用 request.res.setHeader() 来 return 刷新 header 中的令牌信息,在单元测试中,我尝试模拟此功能,但总是出现错误 - “TypeError : request.res.setHeader 不是函数”,如果我删除此 request.res.setHeader(...) 行,则测试通过。以下是我的请求模拟脚本:
export const mockRequest = {
user: readerStub(),
res: jest.fn().mockImplementation(() => {
return { setHeader: jest.fn() };
}),
};
谁能告诉我这是什么问题?
完整的登录单元在这里
async login(request) {
const readerID = request.user._id;
const accessToken = this.getJwtAccessToken(readerID);
const refreshToken = this.getCookieJwtRefreshToken(readerID);
await this.setRefreshToken(refreshToken[1], readerID);
request.res.setHeader('Set-Cookie', refreshToken[0]);
//create the log for success activity
this.logger.info(`Success login for reader ${request.user.username}`);
return {
token_info: accessToken,
expireIn: process.env.ACCESS_TOKEN_TIMER,
};
}
单元测试代码在这里
describe('login', () => {
describe('when login is called', () => {
let token: TAccessToken;
beforeEach(async () => {
jest
.spyOn(readerService, 'getJwtAccessToken')
.mockImplementationOnce(() => accessTokenStub().token_info);
jest
.spyOn(readerService, 'getCookieJwtRefreshToken')
.mockImplementationOnce(() => {
return [
refreshTokenStub().refreshToken_Cookie,
refreshTokenStub().refreshToken,
];
});
jest
.spyOn(readerService, 'setRefreshToken')
.mockImplementationOnce(async () => Promise.resolve('OK'));
token = await readerService.login(mockRequest);
});
test('then it should call setRefreshToken', () => {
expect(readerService.setRefreshToken).toHaveBeenCalledWith(
refreshTokenStub().refreshToken,
readerStub()._id,
);
});
test('then it should return a access token in body', () => {
expect(token).toEqual(accessTokenStub());
});
});
});
res
本身不是函数,所以当您执行 res: jest.fn()...
时,您永远不会进入模拟,因为它没有被称为 res()
,它只是被称为 res.setHeader
。而不是做 res: jest.fn().mockImplementation(()=> ({ setHeader: jest.fn() }))
你应该做 res: { setHeader: jest.fn() }
我的登录方法使用 request.res.setHeader() 来 return 刷新 header 中的令牌信息,在单元测试中,我尝试模拟此功能,但总是出现错误 - “TypeError : request.res.setHeader 不是函数”,如果我删除此 request.res.setHeader(...) 行,则测试通过。以下是我的请求模拟脚本:
export const mockRequest = {
user: readerStub(),
res: jest.fn().mockImplementation(() => {
return { setHeader: jest.fn() };
}),
};
谁能告诉我这是什么问题?
完整的登录单元在这里
async login(request) {
const readerID = request.user._id;
const accessToken = this.getJwtAccessToken(readerID);
const refreshToken = this.getCookieJwtRefreshToken(readerID);
await this.setRefreshToken(refreshToken[1], readerID);
request.res.setHeader('Set-Cookie', refreshToken[0]);
//create the log for success activity
this.logger.info(`Success login for reader ${request.user.username}`);
return {
token_info: accessToken,
expireIn: process.env.ACCESS_TOKEN_TIMER,
};
}
单元测试代码在这里
describe('login', () => {
describe('when login is called', () => {
let token: TAccessToken;
beforeEach(async () => {
jest
.spyOn(readerService, 'getJwtAccessToken')
.mockImplementationOnce(() => accessTokenStub().token_info);
jest
.spyOn(readerService, 'getCookieJwtRefreshToken')
.mockImplementationOnce(() => {
return [
refreshTokenStub().refreshToken_Cookie,
refreshTokenStub().refreshToken,
];
});
jest
.spyOn(readerService, 'setRefreshToken')
.mockImplementationOnce(async () => Promise.resolve('OK'));
token = await readerService.login(mockRequest);
});
test('then it should call setRefreshToken', () => {
expect(readerService.setRefreshToken).toHaveBeenCalledWith(
refreshTokenStub().refreshToken,
readerStub()._id,
);
});
test('then it should return a access token in body', () => {
expect(token).toEqual(accessTokenStub());
});
});
});
res
本身不是函数,所以当您执行 res: jest.fn()...
时,您永远不会进入模拟,因为它没有被称为 res()
,它只是被称为 res.setHeader
。而不是做 res: jest.fn().mockImplementation(()=> ({ setHeader: jest.fn() }))
你应该做 res: { setHeader: jest.fn() }