![](/img/trans.png)
[英]Getting a UnhandledPromiseRejectionWarning when testing using mocha/chai
[英]Testing JWT Authentication Using Mocha and Chai
我一直在為我的get
端點編寫測試,這需要admin
的令牌才能返回用戶列表。
這是我的用戶端點:
app.get("/users", (req,res) => {
const payload = req.payload
if (payload && payload.user === "admin") {
User.find({}, (err, users) => {
if(!err) {
res.status(200).send(users)
} else { res.status(500).send(err) }
})
} else { res.status(500).send("Authentication Error!)}
}
這是我的 jwt 中間件:
module.exports = {
validateToken: (req, res, next) => {
const authorizationHeader = req.headers.authorization;
let result;
if (authorizationHeader) {
const token = req.headers.authorization.split(" ")[1]; // Bearer <token>
const options = {
expiresIn: "2d",
issuer: "clint maruti"
};
try {
// verify makes sure that the token hasn't expired and has been issued by us
result = jwt.verify(token, process.env.JWT_SECRET, options);
// Let's pass back the decoded token to the request object
req.decoded = result;
// We call next to pass execution to the subsequent middleware
next();
} catch (err) {
// Throw an error just in case anything goes wrong with verification
throw new Error(err)
}
} else {
result = {
error: 'Authentication error. Token required.',
status: 401
}
res.status(401).send(result)
}
}
};
這是我的示例測試:
let User = require("../models/users");
// Require dev dependencies
let chai = require("chai");
let chaiHttp = require("chai-http");
let app = require("../app");
let should = chai.should();
chai.use(chaiHttp);
let defaultUser = {
name: "admin",
password: "admin@123"
};
let token;
// parent block
describe("User", () => {
beforeEach(done => {
chai
.request(app)
.post("/users")
.send(defaultUser)
.end((err, res) => {
res.should.have.status(200);
done();
});
});
beforeEach(done => {
chai
.request(app)
.post("/login")
.send(defaultUser)
.end((err, res) => {
token = res.body.token;
res.should.have.status(200);
done();
});
});
afterEach(done => {
// After each test we truncate the database
User.remove({}, err => {
done();
});
});
describe("/get users", () => {
it("should fetch all users successfully", done => {
chai
.request(app)
.set("Authentication", token)
.get("/users")
.end((err, res) => {
res.should.have.status(200);
res.body.should.be.a("object");
res.body.should.have.property("users");
done();
});
});
});
});
問題:我的測試給了我一個斷言錯誤 500 而不是狀態碼的 200,我在beforeEach
函數之前寫了 2 beforeEach
。 一個,注冊管理員,另一個登錄管理員並獲取令牌。 我想知道這是否是導致錯誤的原因? 請幫忙
我在這里找到了答案:
如何在 Mocha 測試用例中發送標題('授權','不記名令牌')
你必須設置{ Authorization: "Bearer" + token }而不是"Authentication", token
你必須在.get之后調用.set
describe("/get users", () => {
it("should fetch all users successfully", (done) => {
chai
.request(app)
.get("/users")
.set({ Authorization: `Bearer ${token}` })
.end((err, res) => {
res.should.have.status(200);
res.body.should.be.a("object");
res.body.should.have.property("users");
done();
});
});
});
chai-http 具有發送授權承載令牌的auth
功能。
根據 Github 上的chai-http代碼,可以使用以下方式傳遞令牌:
.auth(accessToken, { type: 'bearer' })
在類似問題上提供的示例: https : //stackoverflow.com/a/66106588/4067905
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.