【问题标题】:Assert not working in mocha when using child_process exec使用 child_process exec 时断言在 mocha 中不起作用
【发布时间】:2016-06-15 09:30:53
【问题描述】:

我在单元测试代码中遇到了一些问题,该代码使用了一个使用 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();
});

【问题讨论】:

    标签: javascript node.js windows unit-testing mocha.js


    【解决方案1】:

    您的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 上的任何等价物),或者立即结束的简单命令.

    【讨论】:

    • 我在 Windows 上运行了测试。尝试四次后 Ping 将停止。但是,测试的默认时间限制是 2 秒,而 ping 命令的持续时间比这更长。所以你是100%正确的!谢谢! (Ping 确实是一个占位符)
    • 我没有意识到 Window 的 ping 会有这种行为。感谢您的评论。我已经编辑了我的答案,以使其对未来的读者有用。
    猜你喜欢
    • 2014-07-16
    • 2022-11-10
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    • 2016-05-08
    • 2018-12-12
    • 1970-01-01
    相关资源
    最近更新 更多