2015-11-28 123 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++ 

有了這個解決方案,你需要重複,只要你在部署生產應用程序中的分析操作。