有没有办法在自定义匹配器中使用Jasmine默认匹配器?

Fis*_*ter 9 javascript unit-testing matcher jasmine

我在一些形式的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;
    }
});
Run Code Online (Sandbox Code Playgroud)

当然,actualItem.thing == elem实际上并没有比较对象内容 - 我必须在JavaScript中使用对象比较中的一个更复杂的解决方案.

不过,我不禁注意到,Jasmine已经有了一个很好的对象相等检查器:expect(x).toEqual(y).有没有办法在自定义匹配器中使用它?有没有在自定义匹配器中使用匹配器的一般方法?

Ste*_*McD 6

是的,它有点hacky但完全有可能.

我们需要做的第一件事是使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();
      };

    })();
Run Code Online (Sandbox Code Playgroud)

因此,在execJasmine函数声明之后,我通过添加以下内容将jasmineEnv推送到全局命名空间:

this.jasmineEnv = jasmineEnv;
Run Code Online (Sandbox Code Playgroud)

现在,在我的任何spec文件中,我都可以访问jasmineEnv变量,这是包含匹配器核心代码的内容.

具体看toEqual,toEqual调用jasmine.Env.prototype.equals_函数.这意味着您可以在customMatcher中执行以下操作:

beforeEach(function(){
    this.addMatchers({
        isJasmineAwesome    : function(expected){
            return jasmineEnv.equals_(this.actual, expected);
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

不幸的是,使用此方法只能访问以下方法:

  1. compareObjects_
  2. 等于_
  3. contains_

其余的匹配者都是jasmine.Matchers类,但我还没有公开.我希望这能帮助你解决这个问题