我使用摩卡,通过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()
- })
- })
这样,摩卡“知道”当你的测试结束,只有在它运行下一个测试.