我使用的断言模块中的node.js https://www.npmjs.com/package/assert简单的方法
在C/C++启用/ node.js的中禁用断言语句,可以很容易地启用/禁用与宏断言语句。一般情况下,node.js和javascript可以做同样的事情吗?
我使用的断言模块中的node.js https://www.npmjs.com/package/assert简单的方法
在C/C++启用/ node.js的中禁用断言语句,可以很容易地启用/禁用与宏断言语句。一般情况下,node.js和javascript可以做同样的事情吗?
请注意,您正在使用的the package将assert作为模块添加,因此为polyfills。
您可以简单地覆盖对象的部分以禁用polyfill。
例子:
比方说,你要禁用deepEqual
断言,目前看起来是这样的:
assert.deepEqual = function deepEqual(actual, expected, message) {
// disable
};
:
assert.deepEqual = function deepEqual(actual, expected, message) {
if (!_deepEqual(actual, expected)) {
fail(actual, expected, message, 'deepEqual', assert.deepEqual);
}
};
你可以简单地通过执行类似覆盖它FYI:
断言声明在程序中ESS:http://wiki.ecmascript.org/doku.php?id=strawman:assert
这里有一些解决方案:
1.测试全局变量每次调用之前
const devMode = false; // or var, if you use older javascript version
devMode && assert(...);
根据需要这个工作在许多情况下,而不是当你使用assert
与侧 - 如下所示:
devMode && assert(value++, 'Value should not have been 0');
devMode && assert(myfunc(), 'myfunc unexpectedly returned false');
devMode && assert.throws(function() {
home = '/home';
throw new Error("Wrong value");
}, Error);
在上面的构造中,断言调用的参数当不在devMode
时,不会对其进行评估。因此value
将不会增加,myfunc
将不会被调用,并且home
将不会被设置。
如果使用这样的构造,看看第二个解决方案:
2.创建一个模拟assert
在这个解决方案创建具有相同的接口库作为assert
,包括无论是真实的库或您的模拟库:
你的库看起来是这样的:
var assert = function (value, message) {
return true;
}
assert.ok = assert;
assert.fail = assert;
assert.equal = assert;
assert.notEqual = assert;
assert.deepEqual = assert;
assert.notDeepEqual = assert;
assert.strictEqual = assert;
assert.notStrictEqual = assert;
assert.ifError = assert;
// assert.throws should only be used to confirm that certain code will produce
// an error, but it should not change any state outside the function's scope.
// This mock version will NOT execute any of the functions passed to it.
assert.throws = assert;
// For assert.doesNotThrow the same choice is made:
assert.doesNotThrow = assert;
使用此解决方案传递的参数将被评估,但如果您传递函数引用,则这可能还不够,如assert.throws
和assert.doesNotThrow
的情况。因此,您可能希望以不同的方式实现模拟版本,以便它执行作为第一个参数和/或第二个参数传递的函数,即使在生产模式下也是如此。
3。解析您的代码以进行生产
使用此解决方案,您的目标是从您的代码中删除对assert
的任何引用。如果你只使用断言调用作为语句,而不是作为表达式的一部分,并且如果没有你所依赖的副作用(参见上文),那么确保这些断言语句分别在一行中,并使用一个简单的grep
删除这些行。
我不会详细说明这个方向,但是可以使这个解析器更加智能化,并且(通过使用正则表达式)让它从它们的assert
上下文中展开表达式。这样的解析器将取代:
assert(value++, 'Value should not have been 0')
有:
value++
有了这个解决方案,你需要重复,只要你在部署生产应用程序中的分析操作。