有没有办法将Jasmine匹配器添加到整个环境中

时间:2012-08-13 20:49:07

标签: jasmine jasmine-matchers

有很多文档显示如何将匹配器添加到Jasmine规范(例如here)。

有没有人找到在整个环境中添加匹配器的方法;我想创建一组有用的匹配器,可以被任何和所有测试调用,而不是我的规范中的copypasta。

目前正在努力对源进行逆向工程,但如果存在,则更倾向于使用经过验证的方法。

4 个答案:

答案 0 :(得分:47)

当然,你只需要在没有任何规范范围的情况下调用beforeEach(),并在那里添加匹配器。

这将全局添加toBeOfType匹配器。

beforeEach(function() {
  var matchers = {
    toBeOfType: function(typeString) {
      return typeof this.actual == typeString;
    }
  };

  this.addMatchers(matchers);
});

describe('Thing', function() {
  // matchers available here.
});

我创建了一个名为spec_helper.js的文件,其中包含自定义匹配器,我只需要在运行其余的规范套件之前加载到页面上。

答案 1 :(得分:12)

这是茉莉花2.0 +的一个:

beforeEach(function(){
  jasmine.addMatchers({
    toEqualData: function() {
      return {
        compare: function(actual, expected) {
          return { pass: angular.equals(actual, expected) };
        }
      };
    }
  });
});

请注意,这使用了角度angular.equals

答案 2 :(得分:0)

编辑:我不知道这是一个可能会发生变化的内部实施。使用风险自负。

jasmine.Expectation.addCoreMatchers(matchers)

答案 3 :(得分:0)

根据之前的答案,我为 angular-cli 创建了以下设置。我的匹配器中也需要一个外部模块(在本例中为moment.js)

注意在此示例中,我添加了equalityTester,但它应该与客户匹配器一起使用

使用以下内容创建文件src/spec_helper.ts

// Import module
import { Moment } from 'moment';

export function initSpecHelper() {

  beforeEach(() => {
    // Add your matcher
    jasmine.addCustomEqualityTester((a: Moment, b: Moment) => {
      if (typeof a.isSame === 'function') {
        return a.isSame(b);
      }
    });
  });

}

然后,在src/test.ts导入initSpecHelper()函数添加执行它。我把它放在Angular的TestBed init之前,似乎工作正常。

import { initSpecHelper } from './spec_helper';

//...

// Prevent Karma from running prematurely.
__karma__.loaded = function () {};

// Init our own spec helper
initSpecHelper();

// First, initialize the Angular testing environment.
getTestBed().initTestEnvironment(
  BrowserDynamicTestingModule,
  platformBrowserDynamicTesting()
);

//...