Jasmine 2.0での単体テスト用のカスタムマテリアルの作成

最近、私はジャスミンでカスタム仲人を書く必要に遭遇しました。 最初にグーグル検索を開始し、すべてが明確に説明されている例を見つけました。 実際には、コードは次のとおりです。



describe('Hello world', function () { beforeEach(function() { this.addMatchers({ toBeWithinOf: function(distance, base) { this.message = function() { var lower = base - distance, upper = base + distance; return "Expected " + this.actual + " to be between " + lower + " and " + upper + " (inclusive)"; }; return Math.abs(this.actual - base) <= distance; } }); }); it('should be within in range', function () { expect(8).toBeWithinOf(2, 6); }); });
      
      







この例では、入力された数値( this.actual )が特定の間隔にあるかどうかを報告するマッチャーを作成します。 一致を呼び出すとき、2つのパラメーターが渡されることに注意してください。base-両側で測定される数値、特定の値-distance 、最終的に検索間隔を形成する- [base-distance、base + distance] 。 この場合、8は間隔[4、8]にあると予想されます。 ユーザーが指定した数値が間隔外の場合、テストではthis.message関数を使用して生成したエラーが表示されます。



すべては何もないように見えますが、ジャスミン2.0でサンプルを実行すると、これは機能しません。 構文が少し変更されていることがわかります。



たくさんの方法を試してみて、複数のフォーラムに登って、この問題を解決することができました。 ソリューションコードは次のとおりです。



 describe('Hello world', function () { beforeEach(function () { jasmine.addMatchers({ toBeWithinOf: function () { return { compare: function (actual, distance, base) { var lower = base - distance, upper = base + distance, result = { pass: Math.abs(actual - base) <= distance }; if(!result.pass) { result.message = "Expected " + actual + " to be between " + lower + " and " + upper + " (inclusive)"; } return result; } } } }) }); it('should be within in range', function () { expect(8).toBeWithinOf(2, 6); }); });
      
      





ご覧のとおり、マッチャーを追加する関数を呼び出すメソッドが変更されました-( this.addMatchers-> jasmine.addMatchers )。 また、関数自体から、 比較メソッドを宣言するオブジェクトを返すことを強制されます。このメソッドは、一致関数自体ではなく、すべてのパラメーターを受け取ります。



最初のパラメーター( actual )は確認する数値に対応し、パラメーターをゲーマーに転送する必要がある場合(この場合、ベースと距離)に指定できることに注意してください。



比較関数自体の中に、すぐに比較プロパティを書き込むオブジェクトを作成します( pass )。 そして、このプロパティが最終的に機能しない場合にのみ、 メッセージプロパティのみが作成され、テストが失敗したときにユーザーに表示されるテキストを作成できます。



実例へのリンクはここにあります- フィドル



以上です。



All Articles