私のサーバーにヒットしたすべてのPOSTリクエストで有効なContent-TypeヘッダーをチェックするExpressミドルウェアがあります。このミドルウェアのコードは次のとおりです。ユニットテストへの正しい方法Expressミドルウェア
import * as STRINGS from "../Common/strings";
function ContentTypeValidator(req, res, next) {
let contentHeader = req.get("content-type");
if(!contentHeader) {
res.status(400).send(STRINGS.ERROR_CONTENT_TYPE_MISSING);
} else {
if(contentHeader.toLowerCase() !== "application/json") {
res.status(415).send(STRINGS.ERROR_CONTENT_TYPE_UNSUPPORTED);
} else {
next();
}
}
}
export default ContentTypeValidator;
私はTDDのためmocha
、chai
とnode-mocks-http
を使用していますが、res.send()
が私のためにこの要求の終了を処理するようnext()
が呼び出されないとき、私の質問は、テストを取り囲んでいます。上記第一の試験において
it("Should return 200 for valid Content-Type header", (done) => {
req = nodeMocks.createRequest({
headers: {
"Content-Type": "application/json"
}
});
ContentTypeValidator(req, res, (err) => {
res.statusCode.should.equal(200);
expect(err).to.be.undefined;
done();
});
});
it("Should return 400 if Content-Type header is missing", (done) => {
ContentTypeValidator(req, res,() => {});
res.statusCode.should.equal(400);
res._getData().should.equal("Content-Type header missing");
done();
});
、私はこれを通過することを期待していたので、私はnext()
関数として作用する関数に渡すと、このテストに合格。 2番目のテストでは、これが失敗すると予想しています。関数を渡すと、mocahは、res.send()
がこのインスタンスでそれを処理しているので、コールバック関数が呼び出されないので、テストが2000msを超えていると不平を言う。
このようなExpressミドルウェアを単体テストする場合、2番目のテストを正しく書いた方法はありますか、これを行うにはより良い/より適切な方法がありますか?
EDIT:次のコールバックが呼び出されないときにミドルウエアをテストしたいと思っています。私は明らかに次のコールがあるかどうかを確認するのにsinon
を使用しています。私はコールバック関数が呼び出されないときに単体テスト方法を見たいと思っています。
私はそれは私が明らかに複製しています質問は異なっているかを示すために質問を編集しました。 –
あなたはres機能をスパイするためにsinonを使用できますか?例えば 'VARの解像度を= {からstatusCode:sinon.spy()};' 、私は実際には1つが、その答えは、より多くのことを思わ見ていた(500) ' – esperluette