1. ホーム
  2. ジャバスクリプト

[解決済み】Mocha / Chai expect.to.throwがスローエラーをキャッチしない

2022-03-30 05:47:37

質問

チャイの入手に問題があります。 expect.to.throw は、私のnode.jsアプリのテストで動作します。テストはスローされたエラーで失敗し続けますが、テストケースをtryとcatchでラップし、キャッチされたエラーでアサートすると、それは動作します。

expect.to.throw は、私が考えているように動作しないのか、それとも何か?

it('should throw an error if you try to get an undefined property', function (done) {
  var params = { a: 'test', b: 'test', c: 'test' };
  var model = new TestModel(MOCK_REQUEST, params);

  // neither of these work
  expect(model.get('z')).to.throw('Property does not exist in model schema.');
  expect(model.get('z')).to.throw(new Error('Property does not exist in model schema.'));

  // this works
  try { 
    model.get('z'); 
  }
  catch(err) {
    expect(err).to.eql(new Error('Property does not exist in model schema.'));
  }

  done();
});

失敗したこと

19 passing (25ms)
  1 failing

  1) Model Base should throw an error if you try to get an undefined property:
     Error: Property does not exist in model schema.

解決方法は?

に関数を渡す必要があります。 expect . こんな感じで。

expect(model.get.bind(model, 'z')).to.throw('Property does not exist in model schema.');
expect(model.get.bind(model, 'z')).to.throw(new Error('Property does not exist in model schema.'));

に渡すというやり方です。 expect その 結果 を呼び出すと model.get('z') . しかし、何かが投げられたかどうかをテストするためには、関数を expect は、どの expect は自分自身を呼び出します。その bind メソッドは新しい関数を作成し、それが呼ばれたときに model.getthis の値に設定します。 model を設定し、第1引数に 'z' .

をうまく説明すると bind が見つかります。 こちら .