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。(如果这对你有意义)。

那么,如果我因异常而使自定义匹配器失败,我该如何测试呢?

4

1 回答 1

0

如果你想测试你的自定义匹配器,当你只应用你的匹配器时会出现几个问题。对于大多数简单的自定义匹配器,您只需执行expect(actual).toBeCustom(expected). 如果测试通过,则匹配器正常。对于倒置的情况,只需添加.not.

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

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

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

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

于 2015-05-05T16:06:35.640 回答