2009-07-14 33 views
5

比方说,我有一个方法需要一些参数并将它们存储为实例变量。如果其中一个为空,稍后的一些代码将会崩溃。如果提供了空参数,你会修改引发异常的方法,并添加单元测试来检查吗?如果我这样做,它有点复杂,因为JavaScript有很多不好的值(空,未定义,NaN等),并且由于它具有动态类型,所以我甚至无法检查是否传入了正确的对象。单元测试时检查错误参数有多重要?

回答

7

我认为这取决于你要进行单元测试的API类型。如果这是一个专为内部使用而设计和构建的组件,并且您知道使用情况将受到一定的限制,但对于错误的参数进行单元测试可能过于夸张。另一方面,如果你正在谈论某种外部发布的东西,或者是在各种情况下使用的东西,其中一些很难预测,是的,检查不良参数是适当的。这一切都取决于使用情况。

7

我想你真的有两个不同的问题在这里。

第一种是参数输入验证的最佳做法,第二种是您的单元测试应处理这些情况的测试。

我会建议您为参数提供一个参数异常,但该参数没有正确提供给您的函数或某些其他通知调用函数/用户情况的变量/消息。通常情况下,你不想抛出异常,并且应该尽量防止函数在你知道它们会失败时被调用。

对于您的单元测试,您应该包含NULL值测试以确保发生优雅结果。

+1

我同意这一点。参数测试应在函数/方法*本身*中适用(即几乎所有时间)。 – Noldorin 2009-07-15 00:02:31

1

JavaScript有的instanceof的typeof,可以帮助您检查正在传递什么样的对象,以你的函数:

'undefined' == typeof noVariable; // true 
var noVariable = null; 
'undefined' == typeof noVariable; // false 
typeof noVariable; // 'object' 
noVariable === null; // true 

var myArray = []; 
typeof myArray; // 'object' 
myArray instanceof Object; // true 
myArray instanceof Array; // true 

var myObject = {}; 
typeof myObject; // 'object' 
myObject instanceof Object; // true 
myObject instanceof Array; // false 

您可以使用这些用于设置一些默认的“坏”的价值观您实例变量:

function myFunction(foo,bar) { 
    foo = foo instanceof Array ? foo : []; // If 'foo' is not an array, make it an empty one 
    bar = bar instanceof Number ? bar : 0; 

    // This loop should always exit without error, although it may never do a single iteration 
    for (var i=0; i<foo.length; i++) { 
     console.log(foo[i]); 
    } 

    // Should never fail 
    bar++; 
} 

运营商也非常有用:

function myFunction(blat) { 
    var blat = blat||null; // If 'blat' is 0, '', undefined, NaN, or null, force it to be null 

    // You can be sure that 'blat' will be at least *some* kind of object inside this block 
    if (null!==blat) { 
    } 
} 
+1

如果它是一个数组,foo将等于true? – 2013-12-20 18:11:43

0

此外,不要忘记,JavaScript可以传递少于或多于预期的参数数量。如果你喜欢,你也可以检查一下。

0

为了创建健壮和安全的代码,检查边缘案例是绝对重要的任务。正面和负面测试总是对质量有好处。从长远来看,缺乏负面测试可能会让你感到厌烦。

所以我会说这是最好的发挥它的安全 - 做到这一点。这是多一点工作,但如果你能负担得起的时间,那么它是值得的。有时候,戴上开发人员的帽子并戴上黑客帽子可能会非常有趣。