- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个中间件功能,它检查 session token 以查看用户是否是管理员用户。如果所有检查都通过,该函数不会返回任何内容,而只是调用 next()。
在对 Sinon spy 的 next() 回调进行断言之前,如何等待内部异步 Promise (adminPromise) 解决?测试当前将失败,因为测试中的断言是在 AdminMiddleware.prototype.run 中的 promise 解决之前做出的。
函数是:
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();
});
目前我正在像下面这样包装期望,这将导致测试通过,但看起来像是 hack。此外,如果失败,将导致未处理的 promise 拒绝错误和由于未调用 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();
});
});
最佳答案
一种解决方案是使用 stub 而不是 spy 。尽管它们是两种不同的东西,但我认为您在这种情况下不会失去任何功能,因为您使用的是匿名 spy 。
AdminMiddleware.prototype.run = function (req, res, next) {
const adminPromise = Promise.resolve()
adminPromise.then(function (authResponse) {
next()
})
}
it('should call next once if admin', function (done) {
const nextSpy = sinon.stub()
nextSpy.callsFake(() => {
expect(nextSpy.called).to.be.true
done()
})
AdminMiddleware.prototype.run({header: function () {}}, {}, nextSpy);
});
此外,您可以完全避免使用 sinon 进行此断言,并执行类似以下操作:
it('should call next once if admin', function (done) {
let called
const nextSpy = function() {
called = true
expect(called).to.be.true
done()
}
AdminMiddleware.prototype.run({header: function () {}}, {}, nextSpy);
});
在这两个示例中,如果未调用 nextSpy,您仍然会收到超时错误,想不出任何合理的解决方法。如果要避免未处理的 promise 拒绝非常重要,我想你可以这样做:
nextSpy.callsFake(() => {
try {
expect(nextSpy.called).to.be.false
done()
} catch (e) {
console.log(e)
}
})
由于超时,它仍然会导致测试失败,但是它不会抛出未处理的 promise 拒绝错误。
关于javascript - 在对 sinon spy 做出断言之前,等待 sinon stubbed promise 解决,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46911569/
我创建了一个库项目,然后构建它,获取 .aar 并解压缩它。获取包含库的 classes.jar 文件,并将其添加到另一个项目中。该项目识别我的文件,我可以从中调用方法和函数。我的问题是我尝试从我的库
这不是现实世界的问题,我只是想了解如何创建 promise 。 我需要了解如何为不返回任何内容的函数做出 promise ,例如 setTimeout。 假设我有: function async(ca
我是 Promise 的新手。我写了两个例子: 第一个是: new RSVP.Promise(function (resolve, reject) { setTimeout(function
我有一个 nodejs (express) 作为服务器端,一个 angular 6 作为客户端。在服务器中我有中间件功能,可以进行 session 检查。如果 session 无效或不存在,我想向客户
我有一个 nodejs (express) 作为服务器端,一个 angular 6 作为客户端。在服务器中我有中间件功能,可以进行 session 检查。如果 session 无效或不存在,我想向客户
我有四个 I/O 操作:A、B、C 和 D。它们中的每一个都应该使用 vertx.executeBlocking 来执行。我应该有以下行为: //PSEUDOCODE waitForExecuteBl
我是一名优秀的程序员,十分优秀!