我使用摩卡,通过gulp-jsx-coverage和gulp-mocha运行我的测试套件.我所有的测试都按预期运行并通过/失败.但是,我测试的一些模块通过superagent库对我的API进行HTTP请求.
在开发过程中,我还在本地客户端应用程序旁边的localhost:3000上运行我的API,这就是我的客户端测试正在尝试访问的URL.测试时,API通常不会运行.这可能会导致以下错误:
Error in plugin 'gulp-mocha' Message: connect ECONNREFUSED Details: code: ECONNREFUSED errno: ECONNREFUSED syscall: connect domainEmitter: [object Object] domain: [object Object] domainThrown: false Stack: Error: connect ECONNREFUSED at exports._errnoException (util.js:746:11) at TCPConnectWrap.afterConnect [as oncomplete] (net.js:983:19)
我尝试在全局帮助器中的所有超级代理(别名为请求)库中存储所有方法,如下所示:
function httpStub() { return { withCredentials: () => { return { end: () => {} }; } }; }; beforeEach(function() { global.sandBox = sinon.sandBox.create(); global.getStub = global.sandBox.stub(request,'get',httpStub); global.putStub = global.sandBox.stub(request,'put',httpStub); global.patchStub = global.sandBox.stub(request,'patch',httpStub); global.postStub = global.sandBox.stub(request,'post',httpStub); global.delStub = global.sandBox.stub(request,'del',httpStub); }); afterEach(function() { global.sandBox.restore(); });
但是由于某些原因,当遇到一些测试时,方法不会被隐藏,所以我遇到了ECONNREFUSED错误.我已经三重检查,没有我在哪里恢复沙箱或任何存根.
解决方法
问题可能是由于在测试中不正常进行异步处理.想象下面的例子:
it('is BAD asynchronous test',() => { do_something() do_something_else() return do_something_async(/* callback */ () => { problematic_call() }) })
当Mocha发现这样的测试时,它会同步执行do_something,do_something_else和do_something_async.在那一刻,从Mochas的角度来看,测试结束了,Mocha执行afterEach()(这是坏的,问题的还有待调用!)和(甚至更糟),它开始运行下一个测试!
现在显然,以并行方式运行测试(和beforeEach和afterEach)可能会导致真正奇怪和不可预知的结果,所以毫不奇怪的是,有一些错误(可能在每次被调用在一些测试之后,导致解开环境)
该怎么办?
当您的测试结束时,始终向Mocha发出信号.这可以通过返回一个Promise对象,或者通过调用done回调来完成:
it('is BAD asynchronous test',(done) => { do_something() do_something_else() return do_something_async(/* callback */ () => { problematic_call() done() }) })
这样,摩卡“知道”当你的测试结束,只有在它运行下一个测试.