使用 child_process exec 时断言在 mocha 中不起作用
Assert not working in mocha when using child_process exec
我在使用使用 child_process exec 的模块的单元测试代码时遇到了一些麻烦。当我创建一个在 exec 调用内部或之后使用断言的单元测试时,Mocha 无法正常工作。当触发断言时,Mocha 将保持 运行ning 直到达到给定的超时时间。当断言未被触发时,一切都会正常工作。
例如,在此测试用例中,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。根据我的Debian系统上的man
,如果你想ping
早点结束,可以用-c [count]
来设置发送包的个数。或 -w [deadline]
设置必须结束的截止日期。例如,ping -w 1 8.8.8.8
可以很好地处理您的代码。 (还有-W [timeout]
告诉ping
如果没有响应要等多久才会放弃,详见手册。)
如果您只是使用 ping
作为一些占位符命令来测试您的 Mocha 测试的结构,您可以使用 echo foo
代替(或 Windows 上的任何等效项), 或者简单的立即结束的东西。
我在使用使用 child_process exec 的模块的单元测试代码时遇到了一些麻烦。当我创建一个在 exec 调用内部或之后使用断言的单元测试时,Mocha 无法正常工作。当触发断言时,Mocha 将保持 运行ning 直到达到给定的超时时间。当断言未被触发时,一切都会正常工作。
例如,在此测试用例中,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。根据我的Debian系统上的man
,如果你想ping
早点结束,可以用-c [count]
来设置发送包的个数。或 -w [deadline]
设置必须结束的截止日期。例如,ping -w 1 8.8.8.8
可以很好地处理您的代码。 (还有-W [timeout]
告诉ping
如果没有响应要等多久才会放弃,详见手册。)
如果您只是使用 ping
作为一些占位符命令来测试您的 Mocha 测试的结构,您可以使用 echo foo
代替(或 Windows 上的任何等效项), 或者简单的立即结束的东西。