我有一个中间件功能,它检查会话令牌以查看用户是否是管理员用户。如果所有检查都通过,该函数不会返回任何内容,而只是调用 next()。
在对作为 Sinon 间谍的 next() 回调进行断言之前,如何等待内部异步 Promise (adminPromise) 解决?测试当前将失败,因为测试中的断言是在 AdminMiddleware.prototype.run 中的承诺解决之前做出的。
功能是:
AdminMiddleware.prototype.run = function (req, res, next) {
let token = req.header(sessionTokenHeader);
let adminPromise = new admin().send()
adminPromise.then(function (authResponse) {
let adminBoolean = JSON.parse(authResponse).payload.admin;
if (adminBoolean !== true) {
return new responseTypes().clientError(res, {
'user': 'validation.admin'
}, 403);
};
next();
});
};
和测试:
it('should call next once if admin', function (done) {
stub = sinon.stub(admin.prototype, 'send');
stub.resolves(JSON.stringify({success : true, payload : {admin : true}}));
let nextSpy = sinon.spy();
AdminMiddleware.prototype.run({header: function () {}}, {}, nextSpy);
expect(nextSpy.calledOnce).to.be.true;
done();
});
目前我正在包装下面的期望,这将导致测试通过,但看起来像一个黑客。此外,如果它失败,将导致未处理的承诺拒绝错误和超时,因为 done() 没有被调用。
it('should call next once if admin', function (done) {
stub = sinon.stub(admin.prototype, 'send');
stub.resolves(JSON.stringify({success : true, payload : {admin : true}}));
let nextSpy = sinon.spy();
AdminMiddleware.prototype.run({header: function () {}}, {}, nextSpy);
stub().then(function () {
expect(nextSpy.calledOnce).to.be.true;
done();
});
});