2017-11-22 11 views
0

非常に基本的なミドルウェアがありますが、これはテストしたいものです。expressJSの基本的なミドルウェアをテストする

最初の質問は私が使っているテストの種類です。私の理解のために、私はこのコードの単体テストを書くことはできません。 私はそれを統合テストと呼んでいます。あれは正しいですか?

2番目の問題はテスト自体です:私はdone()を使用してタイムアウト、althougに実行しています。 私は何が間違っていますか?そして、このミドルウェアをテストする正しい方法ですか?

/middlewares/graphql.js

module.exports = (req, res, next) => { 
    res.header('Access-Control-Allow-Origin', '*') 
    res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With') 
    if (req.is('application/graphql')) { 
    req.body = { query: req.body } 
    } 
    if (req.method === 'OPTIONS') { 
    res.sendStatus(200) 
    } else { 
    next() 
    } 
} 

/tests/middlewares/graphql.js

import nodeMocks from 'node-mocks-http' 
import middleware from '../middlewares/graphql' 

describe('GraphQL middleware',() => { 
    it('Should return 200 for valid Content-Type header', (done) => { 
    const req = nodeMocks.createRequest({ 
     headers: { 
     'Content-Type': 'application/graphql' 
     }, 
     body: { 
     content: 'anything' 
     }, 
     method: 'OPTIONS' 
    }) 
    const res = nodeMocks.createResponse() 
    middleware(req, res, (err) => { 
     expect(res.statusCode).toEqual(200) 
     expect(res.body.content).toEqual('anything') 
     expect(err).toBeNull() 
     done() 
    }) 
    }) 
}) 

答えて

1

middlewareパラメータとして(req, res, next)持つ関数です。 reqresを送信し、アサーションを処理するコールバックを送信します。私。アサーションテストはnext()として渡されます。

は、リクエスト方法としてOPTIONSを渡すときに呼び出される理由はありません。ミドルウェアは代わりにres.sendStatus(200)を実行します。したがって、ミドルウェアを代わりに(この特定のテストのために)通常の関数として呼び出さなければなりません。

middleware(req, res); 

expect(res.statusCode).to.equal(200); 
expect(res.body.content).to.equal('anything'); 
done(); 

それはres.body以外では失敗しますが、ミドルウェア機能はそのように書かれているためです。

ミドルウェア機能をテストするだけで、私はユニットテストと呼んでいます。 next()が呼び出された後に何が起こるか気にするなら、私はそれを統合テストと呼んでいます。しかし、それが呼び出されたことは、テストされている限り重要ではありません。

ミドルウェアがnext()に電話しなければならない場合は、thisの回答が表示されます。

+0

ありがとうございます。この問題のために残っているのは1つだけです。ボディは未定義ですが、 'createRequest'で設定しています。 'res._getData()'は空文字列です。 – user3142695

+0

@ user3142695あなたはテストで 'req.body'を設定しています。 'res.body'を空でないようにしますか?その後、ミドルウェアでそれを返さなければなりません。 – MikaS

+0

ああそれは私の側での誤解です...私のテストで 'if(req.is( 'application/graphql')){req.body = {query:req.body}}'をどうすれば処理できますか? '' application/graphql''はどこで設定する必要がありますか? – user3142695

関連する問題