2016-11-29 8 views
2

ExpressJsからKoa JS(v1)への古いアプリケーションの移行の一環として。私は発生したエラーを処理するためのミドルウェアを作成しました。カスタムKoaミドルウェアでエラー処理をテストするにはどうすればよいですか?

module.errors = function * (next) { 
    try { 
    yield next; 
    } catch (err) { 
    switch(err && err.message) { 
     case: 'Bad Request': 
     this.status = 400; 
     this.body = {message: 'Bad Request'}; 
     brea; 
     default: 
     this.status = 500; 
     this.body = {message: 'An error has occurred'}; 
    } 

    this.app.emit('error', err, this); 
    } 
} 

それは、このように自分のアプリケーションに含まれます:

const app = require('koa')(); 
const router = require('koa-router'); 
const { errors } = require('./middleware/errors'); 

app.use(errors) 
    .use(router.routes()); 

app.get('/some-request', function *(next){ 
    // request that could error 
}); 

app.listen(); 

このすべてが正常に動作しますが、私は私のユニットテストでミドルウェアをテストしたいのですが、おそらくそれは次のようになります私はまだKoaとGeneratorの両方の機能をかなり新しくしているので、これを行う方法を理解するために苦労しています。

エラー処理ミドルウェアをインポートすると、エラーをスローする関数を渡す必要がありますが、渡された関数をどのように実行するのですか?それは何らかの記述の閉鎖である必要がありますか?ステータスコードなどに設定された値をどのようにアサート/期待するのですか?

const { expect } = require('chai'); 
const { errors } = require('../middleware/errors'); 

describe('errors middleware',() => { 

    it('returns a 500 on a generic error',() => { 
     let thrower = function(){ throw new Error() } 
     let errorHandler = errors(thrower()); 

     // mass of confusion 

     expect(errorHandler.next()).to.throw(Error); 
    }); 
}); 

答えて

0

興亜ミドルウェアは、発電機(リターン/歩留まり複数回)であり、関数のように動作していないので、それは彼らのためにユニットテストを書くために奇妙な感じ。個人的には、エンドツーエンドのテストケースで十分です。

ただし、次のような場合があります。

const { expect } = require('chai'); 
const { errors } = require('../middleware/errors'); 

describe('errors middleware',() => { 

    it('returns a 500 on a generic error',() => { 

     let ctx = { body: {}, status: 404 }; 

     let errorMidIterator = errors().call(ctx, 'NEXT_MID'); 

     // test that it correctly yields to next middleware 
     expect(errorMidIterator.next().value).should.equal('NEXT_MID'); 

     // simualte an error and test if it correctly sets the body 
     expect(errorMidIterator.throw(new Error()).done).to.equal(true); 
     expect(ctx.status).should.equal(500); 
    }); 
}); 

ちょっとしたミドルウェアジェネレータ機能ではなく、ミドルウェアファクトリをファイルからエクスポートするほうが良いと思います。前者は、より多くの制御を提供します(つまり、いくつかの依存関係、この場合はthrower()関数をFactory関数の引数を介して注入することができます)。私のミドルウェアファイルは、これらのように見えます。

module.exports = function MyMiddleware(options) { 
    return function *MyMiddleware(next) { 
     // options.config.foo 
     // options.httpclient.get(..) 
    }; 
} 

最後KOAは、あなたがkoa.js 1.xではによって使用されるこのライブラリhttps://www.npmjs.com/package/coを使用することができます

0

ユニットテストは、(主観)が有用ではないので、セマンティクスを変更するコ、と発電機能をラップジェネレータ関数をラップし、コンテキストオブジェクトをモックします。

const co = require('co'); 
const Emitter = require('events'); 
const { expect } = require('chai'); 
const { errors } = require('../middleware/errors'); 

const wrapped = co.wrap(errors); 
const mockApp = new Emitter(); 

describe('errors middleware',() => { 

    it('returns a 500 on a generic error', (done) => { 
    const ERROR_MSG = 'middleware error'; 
    const ctx = {app: mockApp}; 
    const next = function*() { 
     throw new Error(ERROR_MSG); 
    } 
    wrapped.call(ctx, next) 
     .then(() => { 
     try { 
      expect(ctx.status).to.equal(500); 
      expect(ctx.body.message).to.equal(ERROR_MSG); 
      done(); 
     } catch (err) { 
      done(err); 
     } 
     }) 
     .catch(err => done(err)) 

    }); 
}); 
関連する問題