我来自一个沉重的C#背景,目前正在通过使用Knockout.js和JavaScript的ASP.NET MVC学习。我是一个基于TDD的人,并且遇到了一些障碍,我似乎正在努力解决这个障碍。我已经阅读了一些jsTestDriver的例子,在进行测试之前,所有这些都看起来相当简单......
基本上,我正在尝试进行单元测试(使用JetBrains WebStorm 5.0.4与JsTestDriver一起使用)是一个简单的断言,即在满足某个特定情况时会抛出异常。这应该很简单吧?
我的实际测试用例在jsTestDriver中看起来像这样(删除了任何底层基本代码,只是在单元测试函数本身中引发了异常):
GridControllerTest.prototype.testBasicExceptionType = function () {
assertException(function() {
throw "InvalidDataSourceException";
}, "InvalidDataSourceException");
};
哪个断言我的函数抛出异常的测试用例“InvalidDataSourceException”不是吗?最初我尝试使用声明类型的函数:
function InvalidDataSourceException (){}
GridControllerTest.prototype.testBasicExceptionType = function () {
assertException(function() {
throw new InvalidDataSourceException();
}, "InvalidDataSourceException");
};
任何人都可以指出对我来说非常明显,并告诉我为什么我不能通过这么简单的测试?我是否误解了单元测试功能的结构?
答案 0 :(得分:1)
不同之处在于,在第一个示例中,您正在抛出一个字符串,而在第二个示例中,您正在抛出一个对象。 JavaScript中的对象没有与之关联的规范名称,主要是因为没有类型系统(只是原型)。在第二个示例中,函数被分配给window.InvalidDataSourceException,但是函数对象本身没有名称。特别是,没有默认的反射来获取toString()的名称或等价物来获得规范值。
就个人而言,我完全抛弃了assertException,因为这种原因太过于片状。我开始使用try-catch块。我在try块的末尾调用了fail(),因为它期望在那时抛出,我在catch块中放了另一个测试点,以确保异常是预期的。在我看来,这是一个更好的测试模式,因为它将控制变更的测试从测试中分离出来,因为控制发生了变化。