比方说,我有一个方法需要一些参数并将它们存储为实例变量。如果其中一个为空,稍后的一些代码将会崩溃。如果提供了空参数,你会修改引发异常的方法,并添加单元测试来检查吗?如果我这样做,它有点复杂,因为JavaScript有很多不好的值(空,未定义,NaN等),并且由于它具有动态类型,所以我甚至无法检查是否传入了正确的对象。单元测试时检查错误参数有多重要?
回答
我认为这取决于你要进行单元测试的API类型。如果这是一个专为内部使用而设计和构建的组件,并且您知道使用情况将受到一定的限制,但对于错误的参数进行单元测试可能过于夸张。另一方面,如果你正在谈论某种外部发布的东西,或者是在各种情况下使用的东西,其中一些很难预测,是的,检查不良参数是适当的。这一切都取决于使用情况。
我想你真的有两个不同的问题在这里。
第一种是参数输入验证的最佳做法,第二种是您的单元测试应处理这些情况的测试。
我会建议您为参数提供一个参数异常,但该参数没有正确提供给您的函数或某些其他通知调用函数/用户情况的变量/消息。通常情况下,你不想抛出异常,并且应该尽量防止函数在你知道它们会失败时被调用。
对于您的单元测试,您应该包含NULL值测试以确保发生优雅结果。
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) {
}
}
如果它是一个数组,foo将等于true? – 2013-12-20 18:11:43
此外,不要忘记,JavaScript可以传递少于或多于预期的参数数量。如果你喜欢,你也可以检查一下。
为了创建健壮和安全的代码,检查边缘案例是绝对重要的任务。正面和负面测试总是对质量有好处。从长远来看,缺乏负面测试可能会让你感到厌烦。
所以我会说这是最好的发挥它的安全 - 做到这一点。这是多一点工作,但如果你能负担得起的时间,那么它是值得的。有时候,戴上开发人员的帽子并戴上黑客帽子可能会非常有趣。
- 1. 错误的参数单元测试
- 2. 测试单线功能有多重要?
- 3. 单元测试,黑盒测试时需要多长时间?
- 4. 检查参数值传递给函数在单元测试
- 5. 检查参数在测试
- 6. 单元测试TypeInitializationException错误
- 7. 单元测试错误扔
- 8. 单元测试 - 错误
- 9. Angularjs单元测试错误
- 10. OCMock单元测试错误
- 11. 单元测试我有以下错误
- 12. “太多的自动重定向”错误MVC单元测试
- 13. 引发ArgumentError:错误#参数(0 1)Rails的单元测试
- 14. 使用C99检查单元测试框架时的语法错误
- 15. 单元测试名称很重要吗?
- 16. 单元测试错误,说参数不匹配任何可用的重载
- 17. AngularJS单元测试检查函数没有方法被称为
- 18. 单元测试检查为空
- 19. 角单元测试:检查常量值
- 20. 在错误的测试套件中检测到提升单元测试失败
- 21. 逻辑需要检查单元测试用例方法
- 22. Angular 2单元测试错误:无法解析所有参数DecoratorFactory :(?)
- 23. Angular 2单元测试错误:无法解析'RequestOptions'的所有参数
- 24. 重构一些有许多重复代码的单元测试。
- 25. Ruby单元测试,显示错误的错误数
- 26. Laravel单元测试:运行多种测试方法时出现重定义错误
- 27. Rails:单元测试时,在开始时需要“失败”还是“错误”?
- 28. 在硒测试中检查Javascript错误
- 29. 是单元测试需要
- 30. 单元测试的要点
我同意这一点。参数测试应在函数/方法*本身*中适用(即几乎所有时间)。 – Noldorin 2009-07-15 00:02:31