1. ホーム
  2. javascript

[解決済み] Jest expectにカスタムメッセージを追加するには?

2023-02-14 22:10:40

質問

テストケースに続く画像です。

it('valid emails checks', () => {
  ['[email protected]', '[email protected]'/*, ...*/].map(mail => {
    expect(isValid(mail)).toBe(true);
  });
});

各メールに以下のような自動生成のメッセージを付けたい。 Email '[email protected]' should be valid のように、メールごとに自動生成されるメッセージを追加して、失敗したテストケースを簡単に見つけられるようにしたいです。

のようなものです。

// .map(email =>
expect(isValid(email), `Email ${email} should be valid`).toBe(true);

で可能でしょうか? ジェスト ?

Chaiでは、第2パラメータに expect(value, 'custom fail message').to.be... のように、2番目のパラメータで行うことができましたが、Jasmineでは .because 節で行われているように見えます。しかし、Jestで解決策を見つけることができません。

どのように解決するのですか?

そのようなメッセージを提供することは不可能だと思います。しかし、自分で定義することができます。 マッチャー .

例えば toBeValid(validator) というマッチャーを作ることができます。

expect.extend({
  toBeValid(received, validator) {
    if (validator(received)) {
      return {
        message: () => `Email ${received} should NOT be valid`,
        pass: true
      };
    } else {
      return {
        message: () => `Email ${received} should be valid`,
        pass: false
      };
    }
  }
});

そして、このように使うのです。

expect(mail).toBeValid(isValid);

toBeValid は両方の場合(成功と失敗)にメッセージを返します。なぜなら、これによって .not . このテストは、バリデーションに合格させたいかどうかに応じて、対応するメッセージとともに失敗します。

expect(mail).toBeValid(isValid);
// pass === true: Test passes
// pass === false: Failure: Email ... should be valid

expect(mail).not.toBeValid(isValid);
// pass === true: Failure: Email ... should NOT be valid
// pass === false: Test passes