web-dev-qa-db-ja.com

expect()アサート失敗時にメッセージを出力

Jasmine expect()が失敗したときにカスタムエラーメッセージを出力する方法はありますか?

例として、エンドツーエンドのテストでは、Webページの配列があり、1つのテストを使用して各URLに移動し、各ページに要素が存在することを表明します。私はすべてのexpect()を個別のテストに入れることができることを知っていますが、配列を繰り返し処理し、失敗時にページURLをログに記録したいです。

49
user3517049

[〜#〜] update [〜#〜]

私はまだ人々がこれを見つけているのを見ます。 Jasmineチームからのその後の情報は、予想外の文書化されていない機能があるということです-カスタムの失敗メッセージを含めることができ、それはただ機能します:

expect( fields[i].element.exists() ).toEqual(true, field[i].name + ' is expected to exist');

それはまさに私がもともと探していたものです。

元の答えは次のとおりです

私は今日これをまさに探していました、そして、ここにコメントを置きます: https://github.com/Adobe/brackets/issues/2752

これまでに説明した構文は、Jasmineを拡張して、aを追加できるようにするものです。したがって、次のように記述できます。

expect( fields[i].element.exists() ).toEqual(true).because( field[i].name + 'is expected to exist');

それはまだ数年後に議論されており、実現しないかもしれません。これを行うことがわかった別の方法は、カスタムマッチャーを作成することです。一般的に、すべてのベースをカバーしていることを確認せずにカスタムマッチャーを落胆させると思いますが、この場合は真/偽の値を実際にチェックしているので、マッチャーはそれほど怖くありません。

BeforeEachでカスタムマッチャーを作成できます。

beforeEach(function() {
  var matchers = {
    toEqualBecause: function( value, message ) {
      this.message = function() {
        return "Expected '" + this.actual + "' to equal '" + value + "' because " + message;  
      };

      return this.actual == value;  
    }
 };

  this.addMatchers(matchers);
});

次に、このマッチャーを使用して、失敗を示すメッセージを送信できます。

expect( field[i].element.exists() ).toEqualBecause( true, field[i].name );

これにより、フィールド名などを含む失敗出力が得られます。

Expected 'false' to equal 'true' because account_name
55
PaulL

はい、jasmineでexpect()が失敗したときにカスタムエラーメッセージを出力できます。

 Code Snippet:

  it('print a custom error message when an expect failed', function() {

    var elemenToBeDisplayed=element(by.css("userName"));

    /*custom error message will be displayed if expected condition 
    failed*/

    expect(elemenToBeDisplayed.isPresent).toBe(true,'Write your custom       
         error message here');
   });
30
OptimWorks

Jasmine 3.3には withContext が含まれています。これは、使用しているマッチャーを気にせずに期待値に関する追加情報を指定する公式にサポートされている方法です。

3
HolgerJeromin

他の答えは「期待」をハックする方法を説明していますが、あなたの問題を解決するかもしれない別のアプローチがありますが、少し考えを変える必要があります。 「期待」をテスト対象の動作と考える代わりに、1回の「it」コールでのすべての期待をテスト対象の動作と考えてください。

私がこの問題に最も出くわしたのは、何らかの集中的な解析を行う関数があり、ほぼ同じテストを20個作成したい場合です。

入力と出力を次のように配置します。

var testDatas = [
  {
    input: 'stringtoparse1',
    output: 'String To Parse 1'
  },
  {
    input: 'stringtoparse2',
    output: 'String To Parse 2'
  },
  {
    input: 'stringtoparse3',
    output: 'String To Parse 3'
  },
];

次に、テストデータのリストを反復処理し、insideからループの 'it'を呼び出します。

testDatas.forEach(function(test) {
  it('should parse for input ' + test.input, function() {
    expect(myParser(test.input).toEqual(test.output);
  });
});

テストの周りを飛び回る余分なコードの量を減らすことができ、各期待値または期待値グループごとにメッセージをフォーマットできます。

1
codepuzzler

Jasmineのカスタムメッセージを記録する必要があり、次の方法を使用しました。

beforeEach(function(){
    this.addMatchers({
        customError: function(mesg){
                         this.message= function () {
                                           return mesg;
                                       };
                         return this.actual == true;
                         }
                     });
        });
if(<fail condidtion>){
    expect(false).customError(<Fail message>)
}

上記で言及したのはジャスミン1形式によるものです。ジャスミン2を使用している場合、わずかな変更があります。これがあなたに役立つことを願っています

1
Murali Krishna

fail() メソッドでそれを行うことができます。

it('should fail with a message', function() {    
  if (!foo) fail(`your message here`);
});
1
mrded

Jasmine 3.3以降、withContextを介してそれを行う方法があります

例:

expect(someValue).withContext('expected someValue to be true...').toBe(true)

こちらもご覧ください https://github.com/jasmine/jasmine/issues/641#issuecomment-457037665

0