私は現在、エクスプレスWebアプリでシノン/モカ/チャイをいじっています。認証ミドルウェアを正常に実行させてリクエストをブロックし、別の実行でミドルウェア機能をスタブして追加情報を含むリクエストを通過させるという方法で、認証が適切に機能することを確認しようとしています。
基本的に私のセットアップは次のようになります。
スタブ化する関数を含む helper.js
var helper = {};
helper.verifyAuthCookie = function(req, res, next) {
if (req.signedCookies.auth) {
jwt.verify(req.signedCookies.auth, "secret", {
subject: "a",
issuer: "b",
audience: "c"
}, function(err, decoded) {
if (decoded) {
req.user = {
authenticated: true
};
} else {
req.user = {
authenticated: false
};
}
next();
});
} else {
req.user = {
authenticated: false
};
next();
}
};
module.exports = helper;
test.js
var helper=require("helper.js");
describe("get unauthenticated", function() {
it("should fail", function(done) {
chai.request(server.app)
.get("/queries")
.end(function(err, res) {
expect(err)
.to.not.be.null;
expect(res.status)
.to.be.equal(401);
done();
});
});
});
describe("get unauthenticated", function() {
var verifyCookieStub;
beforeEach(function() {
verifyCookieStub = sandbox.stub(helper, "verifyAuthCookie", function(req, res, next) {
req.user = {
authenticated: true
}
next();
});
});
afterEach(function() {
sinon.assert.calledOnce(verifyCookieStub);
verifyCookieStub.restore();
});
it("should not fail", function(done) {
chai.request(server.app)
.get("/queries")
.end(function(err, res) {
expect(err)
.to.be.null;
expect(res.status)
.to.be.equal(200);
done();
});
});
});
高速 Web アプリ server.js 内
const express = require("express");
const helper = require("./helper.js");
app = express();
app.use(helper.verifyAuthCookie);
app.get("/queries", function(req, res) {
res.send(req.user.authenticated);
});
ここでの問題は、最初のテストは成功するが、2 番目と afterEach アサーションの両方が失敗することです。これは、スタブが適切に機能しなかったことを示しています。
インターネットで検索しているときに、非常によく似たことをしている人を見つけましたが、彼はうまく機能しているようです。彼のGithubレポ
私は何かを完全に見逃していますか?