Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用child_process exec时断言不在mocha中工作_Javascript_Node.js_Windows_Unit Testing_Mocha.js - Fatal编程技术网

Javascript 使用child_process exec时断言不在mocha中工作

Javascript 使用child_process exec时断言不在mocha中工作,javascript,node.js,windows,unit-testing,mocha.js,Javascript,Node.js,Windows,Unit Testing,Mocha.js,我对使用使用child_process exec模块的单元测试代码有一些问题。当我创建在exec调用内部或之后使用断言的单元测试时,Mocha无法正常工作。当一个断言被触发时,Mocha将继续运行,直到达到给定的超时。当断言没有被触发时,一切都将正常工作 例如,在本测试用例中,Mocha将一直运行,直到达到超时: it('someTest', function (done) { var exec = require('child_process').exec; exec('ping 8.

我对使用使用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();用断言检查这些结果的块

这似乎不是一个合适的解决方案。使用这种方法,您将在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键为止。根据my Debian系统上的
man
,如果您希望
ping
提前结束,可以使用
-C[count]
设置要发送的数据包数。或
-w[截止日期]
设置必须结束的截止日期。例如,
ping-w18.8.8.8
可以很好地处理您的代码。(还有
-W[timeout]
告诉
ping
如果没有响应,在放弃之前需要等待多长时间,请参阅手册了解详细信息。)


如果您只是使用
ping
作为占位符命令来测试Mocha测试的结构,那么您可以使用
echo foo
(或者Windows上的任何等效命令),或者简单到可以立即结束的命令。

我在Windows上运行了测试。Ping将在四次尝试后停止。但是,测试的默认时间限制是2秒,ping命令的持续时间比这长。所以你是100%正确的!非常感谢。(Ping确实是一个占位符)我没有意识到窗口的Ping会有这种行为。谢谢你的评论。我对我的答案进行了编辑,以使其对未来的读者有用。