【问题标题】:nodejs and TAPE integration issues. App initialization call gets blockednodejs 和 TAPE 集成问题。应用程序初始化调用被阻止
【发布时间】:2016-03-30 05:40:13
【问题描述】:

我正在使用“磁带”为 nodejs 应用程序创建单元测试。当我运行测试时,该过程被永远阻塞。当我深入挖掘时,我发现如果我运行“nodejs mainapp.js”,这个过程并没有结束。这也阻止了单元测试的运行。

如果注册了事件,nodejs 进程似乎不会结束。就我而言,创建 mongo 或 redis 连接或使用节点模块(例如“node-cache”)会导致这种情况。很难想象所有这些模块都可以避免。 关于如何解决问题的任何建议。我的测试用例非常简单,所以那里有问题。

顺便说一句,我已经验证 nodejs 不会因为 http.listen 而被阻止。有人可能会争论使用模型,我不打算这样做。

test('dummy test', function(t) {
  t.equal('hello world', 'hello world', 'Yes hello world = hellow world');
  t.end();
});

【问题讨论】:

  • 您是否尝试过在测试结束时进行适当的清理,例如关闭与数据库的网络连接等?除非您告诉它,否则 Node 不知道您何时完成此类连接。
  • 在应用程序中,不,我不关闭连接。我没有在测试代码中创建任何连接。
  • 任何创建的连接都会阻止 Node 退出,这是正常行为。因此,除非您关闭连接(或者创建模拟连接),否则 Node 将不知道您何时完成了它们,并且一旦您的测试运行,该进程将不会退出。
  • 谢谢@robertklep。我不得不强制关闭所有网络连接和其他注册到某种事件(如节点缓存)的模块。现在它工作正常。

标签: node.js mongodb node.js-tape


【解决方案1】:

磁带进程保持活动的主要原因是 MongoDB 连接未关闭。在所有测试结束时关闭连接的最简单方法是创建一个空白测试,其中包含关闭 MongoDB 连接的说明。 以下是一个示例,在本例中使用 Mongoose:

var test = require('tape');
var mongoose = require('mongoose');

test('test', function (t) {
    t.pass('Example');
    t.end();
});

test('finish', function (t) {
    mongoose.disconnect();
    t.pass('closing db connection');
    t.end();
});

如果问题确实是 MongoDB 连接,更合适的处理方法是使用 test.onFinish(fn),根据 to documentation

onFinish 挂钩将在所有磁带测试完成后被调用 就在磁带即将打印测试摘要之前。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-03
    • 2016-06-01
    相关资源
    最近更新 更多