【问题标题】:mocha test failing with " MongoError: server sockets closed"mocha 测试失败并显示“MongoError:服务器套接字已关闭”
【发布时间】:2017-02-13 07:51:30
【问题描述】:

我的摩卡咖啡测试失败了:

MongoError: 服务器 XXXX 套接字关闭

我有一个解决方法:

const https = require('https');
const server = https.createServer(..);

close() {
        mongoose.disconnect(); // <-------- I will comment this line
        this.server.close();
    };

我将注释掉mongoose.disconnect(); 行,我的测试套件开始工作。我也想在测试后进行清理。我的每个测试文件都重新创建服务器并从头开始。似乎出现错误是因为在执行下一个测试文件之前需要一些“等待”。

我该如何纠正这个错误?

【问题讨论】:

  • 您可以在测试前后使用 Mocha 挂钩进行清理:mochajs.org/#hooks
  • 感谢火焰。目前,我没有任何活动的 js 项目。发布答案,如果人们同意它有效,我会接受答案。

标签: node.js mongodb mocha.js


【解决方案1】:

解决方案 - 胡克船长来救援!

如果我理解正确,您希望在测试后启动并清理您的服务器。在每次测试之前和之后,您还需要执行一系列重复性任务。

Mocha 为您提供完美的解决方案:向 Hook 先生问好!

Mocha 挂钩是您可以在所有测试之前、所有测试之后或每个测试之前和每个测试之后运行的函数:

文档非常完整,我真的很推荐它。然而,我是你的情况,因为你正在处理数据库,你可能会处理async 钩子。

听起来很复杂?别担心!

这就是sync 钩子的正常工作方式:

describe('hooks', function() {

  before(function() {
    // runs before all tests in this block
  });

  after(function() {
    // runs after all tests in this block
  });

  beforeEach(function() {
    // runs before each test in this block
  });

  afterEach(function() {
    // runs after each test in this block
  });

  //tests
  it("This is a test", () => {
      assert.equal(1, 1);
  });

});

async 钩子只有一个区别:它们有一个参数done,一旦你的任务完成就会调用它。假设我们正在设置一个需要 1.5 秒才能设置的数据库。我们想在所有测试之前执行此操作,并且我们只想执行一次。

假设这是我们 DB 中的 listen 函数:

const listen = callback => {
    setTimeout(callback, 1500);
};

所以在 1.5 秒后,它会调用回调函数,表明它已准备好执行操作。

现在让我们看看如何制作async 钩子:

describe('hooks', function() {

  let myDB;
  before( done => {
      myDB = newDB();
      myDB(done);
  });

  //tests
});

就是这样!希望对您有所帮助!

【讨论】:

  • 最有趣的答案。 ;)
猜你喜欢
  • 2017-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-21
  • 2020-09-17
  • 2013-01-16
相关资源
最近更新 更多