2017-01-13 13 views
2

私のサーバーにヒットしたすべての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のためmochachainode-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を使用しています。私はコールバック関数が呼び出されないときに単体テスト方法を見たいと思っています。

+0

私はそれは私が明らかに複製しています質問は異なっているかを示すために質問を編集しました。 –

+0

あなたはres機能をスパイするためにsinonを使用できますか?例えば 'VARの解像度を= {からstatusCode:sinon.spy()};' 、私は実際には1つが、その答えは、より多くのことを思わ見ていた(500) ' – esperluette

答えて

-1

この答えをチェックしてください

https://stackoverflow.com/a/34517121/4996928

var expect = require('chai').expect; 
var sinon = require('sinon'); 

var middleware = function logMatchingUrls(pattern) { 
    return function (req, res, next) { 
     if (pattern.test(req.url)) { 
      console.log('request url', req.url); 
      req.didSomething = true; 
     } 
     next(); 
    } 
} 

describe('my middleware', function() { 

    describe('request handler creation', function() { 
    var mw; 

    beforeEach(function() { 
     mw = middleware(/./); 
    }); 

    it('should return a function()', function() { 
     expect(mw).to.be.a.Function; 
    }); 

    it('should accept three arguments', function() { 
     expect(mw.length).to.equal(3); 
    }); 
    }); 

    describe('request handler calling', function() { 
    it('should call next() once', function() { 
     var mw  = middleware(/./); 
     var nextSpy = sinon.spy(); 

     mw({}, {}, nextSpy); 
     expect(nextSpy.calledOnce).to.be.true; 
    }); 
    }); 

    describe('pattern testing', function() { 
    ... 
    }); 

}); 
+0

'(res.statusCode).should.equalを試してみてください'sinon'を使って' next() 'が実際に呼び出されたことを確認することに焦点を当てました。私のインスタンスでは、応答が拒否される前に呼び出されるので、次に呼び出すことはできません。 –

+0

https://www.youtube.com/watch?v=BwNMUVzo3vs –

関連する問題