在Node.js中启用/禁用断言语句的简单方法

5
我正在使用node.js中的assert模块 https://www.npmjs.com/package/assert 在C/C++中,可以使用宏轻松启用/禁用断言语句。在node.js和javascript中是否也可以做到这一点?
2个回答

2
请注意,您使用的软件包正在添加断言作为一个模块,因此是填充
您可以简单地覆盖部分对象以禁用填充。
例如: 假设您想要禁用当前看起来像这样的deepEqual断言:
assert.deepEqual = function deepEqual(actual, expected, message) {
  if (!_deepEqual(actual, expected)) {
    fail(actual, expected, message, 'deepEqual', assert.deepEqual);
  }
};

您可以通过类似以下的方式简单地覆盖它:
assert.deepEqual = function deepEqual(actual, expected, message) {
  // disable
};

FYI:
断言语句正在进展中:http://wiki.ecmascript.org/doku.php?id=strawman:assert

2
以下是一些解决方案:
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时,assert调用的参数不会被评估。因此,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.throwsassert.doesNotThrow),这可能仍然不足够。因此,您可能希望以不同的方式实现模拟版本,以便在生产模式下执行作为第一个和/或第二个参数传递的函数。

3. 解析您的代码以进行生产

使用这种解决方案,您的目标是从代码中删除对assert的任何引用。如果您只将assert调用用作语句而不是表达式的一部分,并且如果没有您所依赖的副作用(请参见上文),则确保这些assert语句每个都在单独的一行上,并使用简单的grep来删除这些行。

我不会详细说明这个方向,但是您可以使此解析器更加智能,并(通过使用正则表达式)让它从其assert上下文中取消包装表达式。这样的解析器将替换:

 assert(value++, 'Value should not have been 0')

使用:

 value++

使用这种解决方案时,您需要在生产环境中部署应用程序时重复执行解析操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接