[英]The stdout in child_process cannot output right row before stdin when exec shell in child_process
[英]Assert not working in mocha when using child_process exec
使用單元模塊使用child_process exec的單元測試代碼遇到了一些麻煩。 當我創建在exec調用內部或之后使用斷言的單元測試時,Mocha無法正常工作。 當觸發斷言時,Mocha會一直運行直到達到給定的超時。 當未觸發斷言時,一切將正常工作。
例如,在此測試用例中,Mocha將運行直到達到超時:
it('someTest', function (done) {
var exec = require('child_process').exec;
exec('ping 8.8.8.8', () => {
assert.deepEqual(1, 2, 'test');
done();
});
});
然后,當斷言在exec之外時,仍然會出現相同的問題:
it('someTest2', function (done) {
var exec = require('child_process').exec;
var promise = new Promise((promiseDone) => {
exec('ping 8.8.8.8', () => {
var success = 1 === 2;
promiseDone(success, '1 has to be 2');
});
});
promise.then((success, message) => {
assert.deepEqual(success, true, message); // Assert stops the test but Mocha does not stop
done();
});
});
解決此問題的方法是創建一個before語句,在其中執行使用exec的方法並保存結果,然后創建一個it();。 用assert檢查那些結果的塊。
這似乎不是一個適當的解決方案。 使用這種方法,您可以在before語句中進行單元測試,然后在it()中檢查結果。 塊。 那是不對的。
一個例子:
var success = true;
before(function (done) {
this.timeout(10000);
var exec = require('child_process').exec;
exec('ping 8.8.8.8', () => {
success = 1 === 2;
done();
});
});
it('someTest1', function (done) {
assert.deepEqual(success, true, 'test');
done();
});
您的ping
命令花費的時間超過2秒。 我對Windows並不是很熟悉,但是ping默認會花費超過2秒的時間。 因此,增加超時是一種解決方案。
在* nix系統上,通常會運行ping,直到您按Ctrl-C為止。 根據我的Debian系統上的那man
說法,如果希望ping
更早結束,則可以使用-c [count]
設置要發送的數據包的數量。 或-w [deadline]
設置必須結束的截止日期。 例如, ping -w 1 8.8.8.8
將對您的代碼正常工作。 (還有-W [timeout]
,它告訴ping
如果沒有響應,則在放棄之前要等待多長時間,請參閱手冊。)
如果您只是使用ping
作為占位符命令只是為了測試Mocha測試的結構,則可以改用echo foo
(或Windows上的任何等效方法),或者可以立即結束的簡單操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.