javascript – Mocha测试套件尝试连接到API时出错

前端之家收集整理的这篇文章主要介绍了javascript – Mocha测试套件尝试连接到API时出错前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我使用摩卡,通过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()
  })
})

https://mochajs.org/

这样,摩卡“知道”当你的测试结束,只有在它运行下一个测试.

猜你在找的JavaScript相关文章