我有isMember功能如下;
function isMember(req, res, next) {
MyService.GetUserAsync(authCookie)
.then(function (user) {
next();
})
.catch(function (err) {
if (err.status === 400) {
return res.redirect("/notAllowed");
}
else {
return next(err);
}
});
}
我的测试如下;
beforeEach(function () {
// Overwrite the global timer functions (setTimeout, setInterval) with Sinon fakes
this.clock = sinon.useFakeTimers();
});
afterEach(function () {
// Restore the global timer functions to their native implementations
this.clock.restore();
});
it.only("pass authentication and set authCookie", function (done) {
var user = {
userNameField: "fakeUserName"
};
sinon.stub(MyService, "GetUserAsync").returns(Promise.resolve(user));
var spyCallback = sinon.spy();
var req {};
var res = {};
isMember(req, res, spyCallback);
// Not waiting here!
this.clock.tick(1510);
// spyCallback.called is always false
expect(spyCallback.called).to.equal(true);
done();
});
由于某种原因,this.clock.tick
无效,spyCallback.called
始终为假。
我怎样才能实现我的间谍会等到isMember函数调用next()
?
答案 0 :(得分:1)
sinon fakeTimers替换了全局的setTimeout函数,但是你的代码不包含任何超时函数。
您可以使用setTimeout函数来延迟期望的执行,然后通过调用setTimeout中的done()来解决您的测试。你可以尝试这样的事情:
setTimeout(function () {
expect(spyCallback.called).to.equal(true);
done();
}, 0);
答案 1 :(得分:0)
您需要将done()
置于回调中,因为事件循环在javascript中的工作方式。首先执行所有同步代码,然后执行所有挂起的异步任务。
it()
返回承诺,则会等待。所以,你可以做类似的事情
it.only("pass authentication and set authCookie", function (done) {
var user = {
userNameField: "fakeUserName"
};
sinon.stub(MyService, "GetUserAsync").returns(Promise.resolve(user));
var spyCallback = sinon.spy();
var req {};
var res = {};
return isMember(req, res, spyCallback).then(function () {
expect(spyCallback.called).to.equal(true);
});
});