【问题标题】:Is there any way to use Jasmine default matchers within custom matchers?有没有办法在自定义匹配器中使用 Jasmine 默认匹配器?
【发布时间】:2012-02-15 09:28:42
【问题描述】:

我在一些 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 实际上并不比较对象内容——我必须使用Object comparison in JavaScript 中更复杂的解决方案之一。

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

【问题讨论】:

    标签: javascript unit-testing jasmine matcher


    【解决方案1】:

    是的,这有点骇人听闻,但完全有可能。

    我们需要做的第一件事是使 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 类中,但我还不能公开它。我希望这对您有所帮助

    【讨论】:

    • 太棒了,谢谢!这很可能是我正在寻找的解决方案(您提供的解决方案)比我试图避免的问题(我自己的对象相等检查器)更糟糕的情况。不过,非常酷。
    • 如果您想在另一个自定义匹配器 B 中使用自定义匹配器 A,您可以将匹配器 A 的逻辑添加到 jasmine.Env.prototype 中,然后从匹配器中调用该日志B 通过使用 jasmine.getEnv().myMatcherFn()。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-16
    • 2019-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    相关资源
    最近更新 更多