私は、関数によってスローされた例外のタイプをテストする必要があるコードで作業しています(TypeError、ReferenceErrorなど)。
私の現在のテストフレームワークはAVAであり、2番目の引数t.throws
メソッドとして次のようにテストできます。
it('should throw Error with message \'UNKNOWN ERROR\' when no params were passed', (t) => {
const error = t.throws(() => {
throwError();
}, TypeError);
t.is(error.message, 'UNKNOWN ERROR');
});
テストをJestに書き直し始めましたが、簡単にそれを行う方法が見つかりませんでした。それも可能ですか?
Jestでは、関数をexpect(function).toThrow(blankまたはtype of error)に渡す必要があります。
例:
test("Test description", () => {
const t = () => {
throw new TypeError();
};
expect(t).toThrow(TypeError);
});
既存の関数を引数のセットでスローするかどうかをテストする必要がある場合、expect()で匿名関数内にラップする必要があります。
例:
test("Test description", () => {
expect(() => {http.get(yourUrl, yourCallbackFn)}).toThrow(TypeError);
});
少し奇妙ですが、動作し、私見は読みやすいです:
it('should throw Error with message \'UNKNOWN ERROR\' when no params were passed', () => {
try {
throwError();
// Fail test if above expression doesn't throw anything.
expect(true).toBe(false);
} catch (e) {
expect(e.message).toBe("UNKNOWN ERROR");
}
});
Catch
ブロックは例外をキャッチし、発生したError
でテストできます。予想されるError
がスローされない場合、テストに失敗するには奇妙なexpect(true).toBe(false);
が必要です。それ以外の場合、この行には到達できません(Error
はそれらの前に上げる必要があります)。
私はもう少し簡潔なバージョンを使用します:
expect(() => {
//code block that should throw error
}).toThrow(TypeError) //or .toThrow('expectedErrorMessage')
自分で試したことはありませんが、Jestの toThrow アサーションを使用することをお勧めします。したがって、あなたの例は次のようになります。
it('should throw Error with message \'UNKNOWN ERROR\' when no params were passed', (t) => {
const error = t.throws(() => {
throwError();
}, TypeError);
expect(t).toThrowError('UNKNOWN ERROR');
//or
expect(t).toThrowError(TypeError);
});
繰り返しますが、テストはしていませんが、うまくいくと思います。
これが役立ったら教えてください。
ハッピーコーディング!
Jestには、関数が呼び出されたときにスローされることをテストするメソッドtoThrow(error)
があります。
だから、あなたの場合、あなたはそれをそう呼ぶべきです:
expect(t).toThrowError(TypeError);
試してみるexpect(t).rejects.toThrow()
Test-utilsライブラリの便利なメソッドを書くことになりました
/**
* Utility method to test for a specific error class and message in Jest
* @param {fn, expectedErrorClass, expectedErrorMessage }
* @example failTest({
fn: () => {
return new MyObject({
param: 'stuff'
})
},
expectedErrorClass: MyError,
expectedErrorMessage: 'stuff not yet implemented'
})
*/
failTest: ({ fn, expectedErrorClass, expectedErrorMessage }) => {
try {
fn()
expect(true).toBeFalsy()
} catch (err) {
let isExpectedErr = err instanceof expectedErrorClass
expect(isExpectedErr).toBeTruthy()
expect(err.message).toBe(expectedErrorMessage)
}
}