4

ExpressJs から Koa JS (v1) への古いアプリの移行の一環として。発生したエラーを処理するためのミドルウェアを作成しました。次のようになります。

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 とジェネレーターの機能の両方にまだかなり慣れていないため、これを行う方法を理解するのに苦労しています.

エラー処理ミドルウェアをインポートする場合、エラーをスローする関数を渡す必要があることはわかっていますが、渡された関数をどのように実行すればよいでしょうか? いくつかの説明を閉じる必要がありますか?ステータスコードなどに設定された値をアサート/期待するにはどうすればよいですか?

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);
  });
});
4

3 に答える 3

0

これは、Jest でこの問題を解決した方法です。カスタム res オブジェクトを作成し、それをエラー ハンドラーに渡しました。

const error = require('../../../middleware/error');

describe('error middleware', () => {
    it(' return 500 if there is unhandled error', async () => {
        const res = {
            status: (c) => {this.c = c; return {send: (s) => {this.s = s; return this}}} ,
            c: 200,
            s: 'OK',
        };
        const req = {};
        const next = jest.fn();
        const err = () => {
            throw new Error()
        };
        const errorHandler = error(err, req, res, next);
        expect(errorHandler).toMatchObject({c: 500, s: 'Something failed'});
    });
});
于 2019-04-14T21:22:32.787 に答える