Jasmine expect()
が失敗したときにカスタムエラーメッセージを出力する方法はありますか?
例として、エンドツーエンドのテストでは、Webページの配列があり、1つのテストを使用して各URLに移動し、各ページに要素が存在することを表明します。私はすべてのexpect()
を個別のテストに入れることができることを知っていますが、配列を繰り返し処理し、失敗時にページURLをログに記録したいです。
[〜#〜] 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
はい、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');
});
Jasmine 3.3には withContext が含まれています。これは、使用しているマッチャーを気にせずに期待値に関する追加情報を指定する公式にサポートされている方法です。
他の答えは「期待」をハックする方法を説明していますが、あなたの問題を解決するかもしれない別のアプローチがありますが、少し考えを変える必要があります。 「期待」をテスト対象の動作と考える代わりに、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);
});
});
テストの周りを飛び回る余分なコードの量を減らすことができ、各期待値または期待値グループごとにメッセージをフォーマットできます。
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を使用している場合、わずかな変更があります。これがあなたに役立つことを願っています
fail() メソッドでそれを行うことができます。
it('should fail with a message', function() {
if (!foo) fail(`your message here`);
});
Jasmine 3.3以降、withContextを介してそれを行う方法があります
例:
expect(someValue).withContext('expected someValue to be true...').toBe(true)
こちらもご覧ください https://github.com/jasmine/jasmine/issues/641#issuecomment-457037665