Matcherを使用する
Jest では、マッチャー ("matcher") を使用して、様々な方法で値のテストをすることができます。 このドキュメントでは、よく使われるマッチャーをいくつか紹介します。 マッチャーの完全なリストについては、expect
API ドキュメントをご覧ください。
一般的なマッチャー
値をテストする最も簡単な方法は、厳密に等価であることです。
test('two plus two is four', () => {
expect(2 + 2).toBe(4);
});
このコードでは、expect(2 + 2)
は "expectation" オブジェクトを返します。 マッチャーを利用しなければこれらの "expectation" オブジェクトは大きな効果を発揮しません。 このコードでは、 .toBe(4)
はマッチャーです。 Jestが実行されると、失敗したマッチャーをすべて追跡し、素晴らしいエラーメッセージを表示することができます。
toBe
は Object.is
を使用して厳密な等価性をテストします。 If you want to check the value of an object, use toEqual
:
test('object assignment', () => {
const data = {one: 1};
data['two'] = 2;
expect(data).toEqual({one: 1, two: 2});
});
toEqual
は、オブジェクトまたは配列のすべてのフィールドを再帰的にチェックします。
toEqual
ignores object keys with undefined
properties, undefined
array items, array sparseness, or object type mismatch. To take these into account use toStrictEqual
instead.
You can also test for the opposite of a matcher using not
:
test('adding positive numbers is not zero', () => {
for (let a = 1; a < 10; a++) {
for (let b = 1; b < 10; b++) {
expect(a + b).not.toBe(0);
}
}
});
真偽値(およびそれらしく思える値)
テストにおいて、undefined
, null
, false
の区別が必要な場合がありますが、時にはそれらを異なるものとして扱いたくないこともあります。 Jestには、(それらのケースで) 求められるものを明確に実装したヘルパーが備わっています。
toBeNull
はnull
のみ一致しますtoBeUndefined
はundefined
のみ一致しますtoBeDefined
はtoBeUndefined
の反対ですtoBeTruthy
はif
ステートメントが真であるとみなすものに一致しますtoBeFalsy
はif
ステートメントが偽であるとみなすものに一致します
例:
test('null', () => {
const n = null;
expect(n).toBeNull();
expect(n).toBeDefined();
expect(n).not.toBeUndefined();
expect(n).not.toBeTruthy();
expect(n).toBeFalsy();
});
test('zero', () => {
const z = 0;
expect(z).not.toBeNull();
expect(z).toBeDefined();
expect(z).not.toBeUndefined();
expect(z).not.toBeTruthy();
expect(z).toBeFalsy();
});
あなたは、あなたのコードがしたいことに最も正確に対応するマッチャーを使うべきです。
数値
数値の比較するほとんどの方法について、対応するマッチャーがあります。
test('two plus two', () => {
const value = 2 + 2;
expect(value).toBeGreaterThan(3);
expect(value).toBeGreaterThanOrEqual(3.5);
expect(value).toBeLessThan(5);
expect(value).toBeLessThanOrEqual(4.5);
// toBe and toEqual are equivalent for numbers
expect(value).toBe(4);
expect(value).toEqual(4);
});
わずかな丸め誤差にテストを依存させたくないでしょうから、浮動小数点の値が同一であるかを確認するにはtoEqual
の代わりにtoBeCloseTo
を使用して下さい。
test('adding floating point numbers', () => {
const value = 0.1 + 0.2;
//expect(value).toBe(0.3); このように書くと、丸め込み誤差が原因で期待通りに動作しない
expect(value).toBeCloseTo(0.3); // これならば正しく動く
});