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

时间:2015-11-28 10:37:49

标签: javascript node.js assert

我在node.js中使用assert模块 https://www.npmjs.com/package/assert

在C / C ++中,可以使用宏轻松启用/禁用断言语句。可以为node.js和javascript做同样的事情吗?

2 个答案:

答案 0 :(得分:2)

请注意,您使用的the package是将断言添加为模块,因此polyfills

您可以简单地覆盖对象的部分以禁用填充。

示例:
假设您要禁用当前如下所示的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

答案 1 :(得分: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时不评估断言调用的参数。因此,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的任何引用。如果你只使用断言调用作为语句,而不是作为表达式的一部分,并且如果没有你所依赖的副作用(见上文),那么确保这些断言语句都在一个单独的行上,并使用一个简单的grep删除这些行。

我不会在这个方向上详细说明,但是你可以使这个解析器更加智能化,并且(通过使用正则表达式)让它从它们的assert上下文中解开表达式。这样的解析器将取代:

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

使用:

 value++

使用此解决方案,您需要在生产中部署应用程序时重复解析操作。