我在使用使用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();
});
答案 0 :(得分:3)
您的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上的等价物),或者简单的东西马上结束。