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

时间:2015-11-22 14:47:47

标签: javascript jasmine tdd karma-runner karma-jasmine

我试图在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,则上述函数应抛出错误。

这是我的代表测试/规范的片段:

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一起使用,但它与茉莉v.2.3无关,即与业力有关,尽管代码基于茉莉。

1 个答案:

答案 0 :(得分:11)

<强> TL; DR

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

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

<强> NTL; TR

由于Jasmine 2.x有一个新的Matcher toThrowError(),而Jasmine的toThrow()成了一个新的语义。

  • toThrow()应该用来检查是否抛出任何错误或检查Error的消息(更具体:那些&#39; s {{ 1}})
  • instanceof Error应该用于检查是否抛出了特定错误,或者错误消息是否等于期望

内部toThrowError()toThrow(x)的抛出错误进行相等检查。如果错误和x都是x(例如instanceof Error也是如此),Jasmine检查双方{{1}的相等(一般为TypeError} } attributes。

表单===检查错误消息是否等于或匹配message(字符串或RegExp)

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