如何测试jasmine自定义匹配器由于匹配器中的异常而失败

时间:2014-09-19 19:16:30

标签: jasmine jasmine2.0

下面有一个奇怪的测试规格。

expect(function(){
   expect(null).not.toEqualMoment(testContext.moment1);
}).toThrow();

内部期望失败,因为我的自定义匹配器中的下面的检查会引发异常。

if(!moment.isMoment(actual)) {
    throw new Error(_.string.sprintf('Actual: %s , is not a Moment object.', jasmine.pp(actual)));
}

我认为必须抛出一个异常而不只是返回一个失败的结果,因为如果没有, expect(null).not.toEqualMoment(null)将返回true。 (如果这对你有意义的话)。

所以, 如果我的自定义匹配器出现异常失败,我该如何测试呢?

1 个答案:

答案 0 :(得分:0)

如果您想测试自定义匹配器,只需应用匹配器就可以解决几个问题。 对于大多数简单的自定义匹配器,您只需执行expect(actual).toBeCustom(expected)即可。如果测试通过,匹配器就可以了。 对于倒置情况,只需添加.not

但是,通过这种方式,您不会测试匹配器的内部工作方式,例如匹配器失败时返回的消息,或者 - 在您的情况下 - 匹配器抛出异常。您试图通过嵌套expect调用来测试这一点,这是不可能的。

因此,您需要将匹配器本身添加到测试中并测试compare方法。

expect(toEqualMomentMatcher.compare({}, momentjs())).toThrow('Actual: Object({ }) is not a Moment object');

除了你的问题,我建议你如果实际不是片刻,就让匹配器失败。当actual不是片刻时,只需返回不同的消息。