Jasmine 在 expect().toThrow 上抛出错误,而不是识别抛出的错误

Jasmine throws error on expect().toThrow instead of identifying the thrown error

我在 javascript 学习测试驱动开发的过程中尝试实现打印钻石的功能。

Diamond.prototype.outerSpace = function (current, widest) {

  var currentValue = this.getIndexOf(current);
  var widestValue = this.getIndexOf(widest);

  if (currentValue > widestValue) {
      throw new Error('Invalid combination of arguments');
  }

  var spaces = widestValue - currentValue;
  return new Array(spaces + 1).join(' ');
};

我在错误处理方面遇到问题。如果 currentValue 大于 widestValue,上面的函数应该抛出一个错误。

这是我代表 test/spec 的片段:

it ("should throw an exception, if it is called with D and C", function () {
    var outerSpace = diamond.outerSpace.bind(diamond, 'D', 'C');
    expect(outerSpace).toThrow('Invalid combination of arguments');
});

我也尝试过在 expect(..) 中使用匿名函数,但这也没有用。

控制台消息是:预期函数抛出 'Inval...' 但它抛出错误:参数组合无效。

我不明白,我应该如何处理这些信息。

编辑:这很奇怪,因为它与 Jasmine v.1.3 一起工作,但它不能与 jasmine v.2.3 一起工作,即或与业力一起工作,尽管代码基于 jasmine。

TL;DR

在 Jasmine 2 中,匹配器的语义发生了变化,并且有一个新的匹配器。

使用toThrowError("<message>")toThrow(new Error("<message>")))

NTL;TR

自从 Jasmine 2.x 有了新的匹配器 toThrowError() 并且 Jasmine 的 toThrow() 有了新的语义。

  • toThrow() 应该用于检查 是否有任何错误被抛出 或检查 Error 的消息(更具体的是:某事是 instanceof Error)
  • toThrowError() 应该用于检查是否抛出了 特定的 错误,或者错误消息是否等于预期

在内部 toThrow(x) 对抛出的错误与 x 进行相等性检查。如果错误和 x 都是 instanceof Error(例如 TypeError 也是如此)Jasmine 检查双方的相等性(=== 通常)message属性。

表单toThrowError(x)检查错误信息是否等于或匹配x(字符串或正则表达式)

另一种形式 toThrowError(t, x) 检查错误的类型是否为 t 并且消息是否等于或匹配 x(字符串或正则表达式)