37

有很多文档展示了如何向 Jasmine 规范添加匹配器(例如,这里)。

有没有人找到将匹配器添加到整个环境的方法?我想创建一组有用的匹配器,以供任何和所有测试调用,而无需在我的规范中使用 copypasta。

目前正在对源代码进行逆向工程,但如果存在的话,更喜欢一种经过验证的真实方法。

4

4 回答 4

48

当然,您只需在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,其中包含自定义匹配器之类的内容,我只需要在运行规范套件的其余部分之前将其加载到页面上即可。

于 2012-08-13T20:54:15.607 回答
14

这是茉莉花2.0+的一个:

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

请注意,这使用 angular 的angular.equals.

于 2015-04-24T09:35:28.267 回答
0

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

jasmine.Expectation.addCoreMatchers(matchers)
于 2017-04-25T05:45:39.210 回答
0

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

注意在这个例子中,我添加了一个equalTester,但它应该与客户匹配器一起使用

创建一个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()
);

//...
于 2017-06-19T08:47:35.363 回答