下面有一个奇怪的测试规格。
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。 (如果这对你有意义的话)。
所以, 如果我的自定义匹配器出现异常失败,我该如何测试呢?
答案 0 :(得分:0)
如果您想测试自定义匹配器,只需应用匹配器就可以解决几个问题。
对于大多数简单的自定义匹配器,您只需执行expect(actual).toBeCustom(expected)
即可。如果测试通过,匹配器就可以了。
对于倒置情况,只需添加.not
。
但是,通过这种方式,您不会测试匹配器的内部工作方式,例如匹配器失败时返回的消息,或者 - 在您的情况下 - 匹配器抛出异常。您试图通过嵌套expect
调用来测试这一点,这是不可能的。
因此,您需要将匹配器本身添加到测试中并测试compare
方法。
expect(toEqualMomentMatcher.compare({}, momentjs())).toThrow('Actual: Object({ }) is not a Moment object');
除了你的问题,我建议你如果实际不是片刻,就让匹配器失败。当actual
不是片刻时,只需返回不同的消息。