1

我来自沉重的 C# 背景,目前正在通过 ASP.NET MVC 和 Knockout.js 和 JavaScript 学习。我是一个非常基于 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");

};

谁能指出对我来说非常明显的事情并告诉我为什么我不能通过如此简单的测试?我是否误解了单元测试功能的结构?

4

1 回答 1

1

不同之处在于,在第一个示例中,您正在抛出一个字符串,而在第二个示例中,您正在抛出一个对象。JavaScript 中的对象没有与之关联的规范名称,主要是因为没有类型系统(只有原型)。在第二个示例中,函数被分配给 window.InvalidDataSourceException,但函数对象本身没有名称。特别是,没有默认反射来获取名称或 toString() 的等效项来获取规范值。

就个人而言,我完全放弃了使用 assertException,因为这种原因它太不稳定了。我开始使用 try-catch 块。我在 try 块的末尾调用了 fail(),因为它预计到那时会抛出,并且我在 catch 块中放置了另一个测试点,以确保异常是预期的。在我看来,这是一个更好的测试模式,因为它将控制更改的测试与控制更改的测试分开。

于 2012-11-05T20:39:48.767 回答