11

次の形式のJasmineテスト仕様にカスタムマッチャーがあります。

this.addMatchers({
    checkContains: function(elem){
        var found = false;
        $.each( this.actual, function( actualItem ){

            // Check if these objects contain the same properties.
            found = found || actualItem.thing == elem;
        });
        return found;
    }
});

もちろん、actualItem.thing == elem実際にはオブジェクトの内容を比較しません。JavaScriptのオブジェクト比較では、より複雑なソリューションの1つを使用する必要があります。

ただし、Jasmineにはすでに優れたオブジェクト等価チェッカーがあります:expect(x).toEqual(y)。カスタムマッチャー内でそれを使用する方法はありますか?カスタムマッチャー内でマッチャーを使用する一般的な方法はありますか?

4

1 に答える 1

7

はい、それは少しハッキーですが、完全に可能です。

最初に行う必要があるのは、Jasmine.Envクラスを使用可能にすることです。とにかくすでにセットアップされているので、個人的にはSpecRunner.htmlでこれを実行しました。SpecRunnerをロードすると、次のスクリプトが実行されます。

(function() {
      var jasmineEnv = jasmine.getEnv();
      jasmineEnv.updateInterval = 1000;

      var trivialReporter = new jasmine.TrivialReporter();

      jasmineEnv.addReporter(trivialReporter);

      jasmineEnv.specFilter = function(spec) {
        return trivialReporter.specFilter(spec);
      };

      var currentWindowOnload = window.onload;

      window.onload = function() {
        if (currentWindowOnload) {
          currentWindowOnload();
        }
        execJasmine();
      };

      function execJasmine() {
        jasmineEnv.execute();
      };

    })();

したがって、execJasmine関数宣言の後で、次を追加してjasmineEnvをグローバル名前空間にプッシュします。

this.jasmineEnv = jasmineEnv;

これで、どのスペックファイルでも、jasmineEnv変数にアクセスできます。これには、マッチャーのコアコードが含まれています。

toEqualを具体的に見ると、toEqualはjasmine.Env.prototype.equals_関数を呼び出します。これは、customMatcherで次のことを実行できることを意味します。

beforeEach(function(){
    this.addMatchers({
        isJasmineAwesome    : function(expected){
            return jasmineEnv.equals_(this.actual, expected);
        }
    });
});

残念ながら、この方法を使用すると、次の方法にしかアクセスできなくなります。

  1. compareObjects_
  2. equals_
  3. contains_

残りのマッチャーはjasmine.Matchersクラスに常駐していますが、まだ公開できていません。これが何らかの形であなたを助けることを願っています

于 2012-01-27T21:47:30.050 に答える