我使用的斷言模塊中的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++
有了這個解決方案,你需要重複,只要你在部署生產應用程序中的分析操作。