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 中的对象比较中更复杂的解决方案之一。

不过,我不禁注意到,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. 比较对象_
  2. 等于_
  3. 包含_

其余的匹配器驻留在 jasmine.Matchers 类中,但我还不能公开它。我希望这能以某种方式帮助你

于 2012-01-27T21:47:30.050 回答