Javascript 在node.js中为链接函数编写jest测试
我有一个我想用jest测试的函数,该函数基本上执行一些令牌验证,并接受3个参数 这是我要测试的函数的de代码:Javascript 在node.js中为链接函数编写jest测试,javascript,node.js,unit-testing,express,jestjs,Javascript,Node.js,Unit Testing,Express,Jestjs,我有一个我想用jest测试的函数,该函数基本上执行一些令牌验证,并接受3个参数 这是我要测试的函数的de代码: const verifyToken = (req, res, next) => { // check header or url parameters or post parameters for token var token = req.headers['x-access-token'] if (!token) return res.status(4
const verifyToken = (req, res, next) => {
// check header or url parameters or post parameters for token
var token = req.headers['x-access-token']
if (!token) return res.status(403).send({ auth: false, message: 'No token provided.' })
// verifies secret and checks expire date
jwt.verify(token, config.secret, (err, decoded) => {
if (err) return res.status(500).send({ auth: false, message: 'Failed to authenticate token.' })
//put user inside req.user to use the user in other routes
User.findById(decoded.id, (err, user) => {
if (err) {
return res.status(500).json({
message: err
})
} else if (!user) {
return res.status(404).json({
message: 'No user found'
})
} else {
req.user = user
}
next()
})
})
}
所以我正在编写第一个测试,测试de请求中是否没有给出令牌,它是否发送403和消息。下面是测试
const verifyToken = require('../../config/token')
describe('veryfiy token tests', () => {
it('Should give 403 status when no token is present', () => {
let mockReq = {
headers: {}
}
var mockRes = {
status: code => code
send: message => message
}
let nextCalled = false
let next = () => {
nextCalled = true
}
expect(verifyToken(mockReq, mockRes, next)).toBe(403)
})
})
现在,测试通过,但有一个错误:
TypeError:res.status(…)。发送不是函数
当我在代码中从res.status中删除.send()时,测试通过
我一直在想如何在res对象上模拟status()和send()。但目前还没有找到解决办法
Tnx我认为问题在于
res.status()
的结果没有名为send()
的函数
尝试使用以下方法:
var mockRes = {
status: code => ({
send: message => ({code, message})
}),
};
您应该能够通过以下方式进行测试:
var result = verifyToken(mockReq, mockRes, next);
expect(result.code).toBeDefined();
expect(result.code).toBe(403);
PS:尚未测试代码:)您可以创建链接的模拟类并进行测试,无论是否执行函数 这里有一个例子
class MockResponse {
constructor() {
this.res = {};
}
status = jest
.fn()
.mockReturnThis()
.mockImplementationOnce((code) => {
this.res.code = code;
return this;
});
send = jest
.fn()
.mockReturnThis()
.mockImplementationOnce((message) => {
this.res.message = message;
return this;
});
}
现在使用这个模拟类进行测试。并检查给定函数是否以给定结果执行。
榜样
it("should not call next function, and return 401, if token has not been found", async () => {
let res = new MockResponse(); // here i initialised instance of class
let next = jest.fn();
let req = {cookies:""} // header or cookies where you are receiving token here in my case empty.
await authentication(req, res, next); // here i used my mock res class
expect(next).not.toHaveBeenCalled(); // you must check that next will not be called.
expect(res.status).toHaveBeenCalledWith(401);//you can check result of status
expect(res.send).toHaveBeenCalledWith("not authenticated");// send() message in your function
});
这成功了!我不知道我必须嵌套函数。以tnx为例!