我有一个将包含查询字符串的PUT / api / admin / tickets。
例如:/api/admin/tickets?status=review&email=abcdef@gmail.com。该API将检查MongoDB的电子邮件地址,并将票证状态更新为“已解决”。
它将首先检查查询字符串,如果为空,则将使用req.body.status。
我如何为此编写测试?
我尝试并使用了.query和.send之类的方法,但无济于事。
admin.js
router.put('/tickets', passport.authenticate('jwt', {session: false}), (req, res) => {
const decoded = jwt_decode(req.headers.authorization)
console.log("Admin Status: " + decoded.isAdmin)
if (decoded.isAdmin === false){
res.sendStatus(403);
console.log(decoded.isAdmin)
}
let query = {
email: req.query.email,
"tickets.content": req.body.content,
"tickets.label" : req.body.label,
"tickets.status" : req.body.status
}
let updated = {
"tickets.$.status": (!!req.query.status ? req.query.status : req.body.status),
"tickets.$.label" : (!!req.query.label ? req.query.label : req.body.label )
}
User.findOneAndUpdate(query, updated).then(posts=> {
// console.log("Document updated!")
// console.log(posts)
res.send(posts)
}).catch(err => console.log(err))
})
摩卡咖啡
it('Update ticket status, PUT /api/admin/tickets?status=resolved&email=abc@gmail.com', function(done){
ticketThatNeedsToUpdate = {
email: "abc@gmail.com",
// "tickets.status": "new",
"tickets.content": "I want to have access to the API demo!",
"tickets.label":"API Demo Services"
}
console.log(ticketThatNeedsToUpdate)
request(app)
.put('/api/admin/tickets?status=resolved&email=abc@gmail.com')
.send(ticketThatNeedsToUpdate)
.query({
email: 'abc@gmail.com',
status: 'resolve'
})
.set('Authorization', token)
.expect(200)
.end((err, res)=> {
console.log(res.body)
if (err) return done(err);
done();
});
});
MongoDB中的数据结构
tickets: Array
0: Object
status: "new"
content: "I want to have access to the API demo!"
status: "API Demo Services"
这段代码构成一个查询字符串,并检查管理员是否要根据PUT请求更新票证信息。
在此测试用例中,它将通过abc@gmail.com的电子邮件来查找故障单,并且应在MongoDB中将状态从“新”更新为“已解决”。
执行测试时,console.log(res.body)为“ {}”。