我试图在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无关,即与业力有关,尽管代码基于茉莉。答案 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)
见