簡體   English   中英

使用child_process exec時斷言在Mocha中不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM