2015-11-28 67 views

回答

2

请注意,您正在使用的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

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++ 

有了这个解决方案,你需要重复,只要你在部署生产应用程序中的分析操作。