gpt4 book ai didi

javascript - 使用 child_process exec 时断言在 mocha 中不起作用

转载 作者:可可西里 更新时间:2023-11-01 10:04:23 25 4
gpt4 key购买 nike

我在使用使用 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();
});
});

当 assert 在 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();用断言检查这些结果的 block 。

感觉这不是一个合适的解决方案。使用这种方法,您将在 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),或者简单的立即结束的东西。

关于javascript - 使用 child_process exec 时断言在 mocha 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37831476/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com