Javascript 如何向jasmine全局添加自定义匹配器?

Javascript 如何向jasmine全局添加自定义匹配器?,javascript,jasmine,matcher,jasmine-matchers,Javascript,Jasmine,Matcher,Jasmine Matchers,我需要更换版本1.3中的jasmine.addMatchers函数。当前的API允许将匹配器添加到descripe块,但我更希望能够在任何地方使用我的匹配器,而无需反复添加它们 有没有一种全局方法可以将自己的匹配器添加到jasmine 3.1.0中?请注意,我在jasmine 3.1中没有尝试过这种方法,但我在jasmine 2.8中也是这样做的: 将其放置在测试之前运行的任何代码块中: jasmine.getEnv().beforeEach(() => { jasmine.addMa

我需要更换版本1.3中的
jasmine.addMatchers
函数。当前的API允许将匹配器添加到
descripe
块,但我更希望能够在任何地方使用我的匹配器,而无需反复添加它们


有没有一种全局方法可以将自己的匹配器添加到jasmine 3.1.0中?

请注意,我在jasmine 3.1中没有尝试过这种方法,但我在jasmine 2.8中也是这样做的:

将其放置在测试之前运行的任何代码块中:

jasmine.getEnv().beforeEach(() => {
  jasmine.addMatchers({
    toBeAwesome(util, customEqualityTesters) { ... }
  })
});
可用于编写适用于所有版本的Jasmine以及Jest的matchers

var addMatchers = require('add-matchers');

addMatchers({
  // matcher with 0 arguments
  toBeEvenNumber: function(received) {
    // received : 4
    return received % 2 === 0;
  },
  // matcher with 1 argument
  toBeOfType: function(type, received) {
    // type     : 'Object'
    // received : {}
    return Object.prototype.toString.call(received) === '[object ' + type + ']';
  },
  // matcher with many arguments
  toContainItems: function(arg1, arg2, arg3, received) {
    // arg1     : 2
    // arg2     : 15
    // arg3     : 100
    // received : [100, 14, 15, 2]
    return (
      received.indexOf(arg1) !== -1 &&
      received.indexOf(arg2) !== -1 &&
      received.indexOf(arg3) !== -1
    );
  }
});

你有没有试过创建一个匹配器模块,并在你想使用它们的地方实例化它们?@ManuelBlanco没有,我实际上不知道怎么做。无论如何,我希望我的匹配器可以在任何地方使用,而不需要任何额外的工作,就像内置的匹配器一样。问题承认这是可能的(“当前的API允许将匹配器添加到描述块”),并指出这对于问题的目的是不够的(“我希望能够在任何地方使用我的匹配器,而不必一次又一次地添加它们”)。此代码不需要位于descripe块中。它可以位于任何位置,甚至可以放置在全局范围内(如果您愿意),只要它在测试之前运行。它本质上是在每个之前创建一个全局,而不是绑定到单个descripe块。因此,从技术上讲,这些匹配器仍然是为每个descripe块添加的,但对于你自己代码的用途你只需要指定一次。这个全局的
beforeach
听起来有点骇人,但我想,它会做我想做的。我先尝试了另一个解决方案,它奏效了,所以我会坚持下去。这是一个比
添加匹配器
库好得多的答案。
添加匹配器
很棒,但不允许你这么做o像使用为Jasmine编写的matchers一样自定义失败消息。此外,您还可以交换
beforeach
而不是
beforeach
,这样应该会更好一些。