在生产代码中使用断言? (Node.js中的TDD)

问题描述 投票:1回答:1

我已经开始使用Mocha + Chai + Sinon库在Node.js(使用TypeScript)中为后端编写单元测试,>

作为使函数为任何给定输入返回正确输出的一部分,例如,在登录方法中很有意义:login(userName: string, password: string) : LoginResult我认为必须验证给定的用户名和密码是字符串并且不是未定义。

当给定的输入不是字符串时,TypeScript引擎将发出警报,但不会警告给定的输入未定义,这对于该单元是无效的输入(经过测试的方法。)>

因此,在我正在使用的代码的开头声明:

assert(userName !== undefined, 'Given "userName" is "undefined"); assert(password !== undefined, 'Given "password" is "undefined");

而且我想知道这是否是在生产代码中使用断言进行TDD /防御性编程输入验证并验证其他方法的响应的正确方法,还是可以通过某种方式加以改进。

我正在使用assert-plus库,该库可以基于环境变量(这是一个加号)禁用生产中的断言,但我不确定是否应该这样做,因为断言允许提供更多指示性错误,并避免在意外情况下运行代码。

谢谢!

我已经开始使用Mocha + Chai + Sinon库在Node.js(使用TypeScript)中为后端编写单元测试,使用Mocha + Chai + Sinon库作为该函数为任何给定输入返回正确输出的一部分,这使得...] >

输入验证确实很重要,但它取决于代码在软件中的位置,最后取决于判断。有两种思考方式,您通常会看到这两种观点不同意分配。

总是在任何地方验证

这假设您的代码将脱离上下文,因此您需要先验证该函数中的无效用户输入,然后再使用它。这通常以有据可查的漏洞进行备份。在这种情况下,您要转换每个可断言的情况,并按@Estus Flask的评论将其转换为if&throw。这样做的明显缺点是,您可能会花费大量时间反复验证同一数据。

如果您遵循这种生理,请不要在生产代码中使用断言,请将每个断言转换为if语句,并使用合理的可读错误消息抛出异常。

在系统边界处验证

这假设您已经定义了正确的客户端代码,并且不能将无效数据传递到关键部分。尽管您仍然会尽一切努力来防止远程代码执行,但是由于行为不端的客户端代码,可以访问未定义值的成员并“崩溃”是可以接受的行为。该错误位于客户端代码中,不应仅将无效数据传递给该函数。然后,输入验证全部在应用程序/库的最外层进行。 (例如,在REST路由处理程序中),但是以断言的形式在代码中记录有关数据的断言仍然有意义。这些断言可能出于性能原因而不在生产中,但是在登台和测试代码中是可以接受的。 (您可以在蓝色/绿色部署过程中将它们保持打开状态,以检查新代码是否起作用。)

如果您坚持这种生理,在生产代码中使用断言来记录代码对输入数据和世界状况所做的断言。这些断言在大多数情况下都应该关闭。

javascript node.js mocha tdd assert
1个回答
0
投票

输入验证确实很重要,但它取决于代码在软件中的位置,最后取决于判断。有两种思考方式,您通常会看到这两种观点不同意分配。

© www.soinside.com 2019 - 2024. All rights reserved.