尝试从jest单元测试连接到mongo时超时

时间:2016-04-05 10:38:33

标签: node.js mongodb unit-testing mongoose jestjs

我想用jest和mongoose编写一些单元测试来验证与mongo的数据交互。

我不想在这里模仿mongoose,因为我特别想验证mongo文档的创建/修改/处理方式。

package.json配置为使节点模块保持未被锁定状态:

{
  "jest": {
    "unmockedModulePathPatterns": [
      "node_modules"
    ]
  }
}

在我的实际测试中,我设置了一个beforeAll()钩子来处理连接到mongo:

const mongoose = require('mongoose');

describe('MyTest', () => {

  beforeAll((done) => {
    mongoose.connect('mongodb://127.0.0.1:27017/test');

    let db = mongoose.connection;

    db.on('error', (err) => {
      done.fail(err);
    });

    db.once('open', () => {
      done();
    });
  });

  it('has some property', () => {
    // should pass but actually never gets run
    expect(1).toBe(1);
  });
});

这是输出:

/usr/local/bin/node node_modules/jest-cli/bin/jest.js --verbose
Using Jest CLI v0.10.0, jasmine2
 FAIL  src/lib/controllers/my-controller/__tests__/my-test.js (5.403s)
MyTest
  ✕ it has some property

MyTest › it has some property
  - Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
        at Timer.listOnTimeout (timers.js:92:15)
1 test failed, 0 tests passed (1 total in 1 test suite, run time 5.903s)

Process finished with exit code 1

每次测试都会超时,因为done()挂钩中永远不会调用beforeAll() - 没有错误抛出也没有任何打印到控制台。我可以在beforeAll()挂钩中放置断点来验证正在运行的代码。似乎猫鼬在尝试打开与Mongo的连接时挂起,然后开玩笑测试超时。

当我在开玩笑环境之外运行类似的代码时,它会按预期连接(即刻连接)。怀疑它可能导致问题,我已经尝试完全禁用了开玩笑的自动插件功能,但行为保持不变。

我想我已经错过了一些非常明显的东西......任何想法可能会发生什么?

  • jest-cli v.0.10.0
  • mongoose v.4.4.11

更新

  • 尝试用普通function(done) {}替换ES6箭头函数语法。没有区别。
  • 尝试通过传递done参数使测试异步,并在测试完成时调用它。没有区别。
  • 在声明mongoose.connect()error事件处理程序
  • 后尝试调用connected
  • 尝试注释掉所有与mongoose相关的代码,以检查beforeAll()挂钩是否正常工作 - 确实如此。

1 个答案:

答案 0 :(得分:3)

Jest-jasmine与Jasmine 不同。
您使用的语法实际上属于Jasmine 2.0+,而不是Jest-jasmine。因此,如果您想继续使用jest,您必须查看jest docs以找到答案 更重要的是,"在所有"之前不是标准的jest注入变量,请参阅jest api

我使用Jasmine 2.3.4运行你的代码,它运行得很好。我尝试了Promise / pit来完成这项工作,但失败了。

首先,install jasmine

npm install -g jasmine
mkdir jasmine-test  
cd jasmine-test
jasmine init
jasmine examples
touch spec/mongodbspec.js

这是我的目录结构:

fenqideMacBook-Pro:jasmine-test fenqi$ ls -R
.:
spec/

./spec:
mongodbspec.js  support/

./spec/support:
jasmine.json

然后,编辑spec / mongodbspec.js,我只需添加一行" '使用严格的&#39 ;; "你的代码。

'use strict';

const mongoose = require('mongoose');

describe('MyTest', () => {

  beforeAll((done) => {
    mongoose.connect('mongodb://127.0.0.1:27017/test');

    let db = mongoose.connection;

    db.on('error', (err) => {
      done.fail(err);
    });

    db.once('open', () => {
      done();
    });
  });

  it('has some property', () => {
    // should pass but actually never gets run
    expect(1).toBe(1);
  });
});

最后,运行' jasmine' :

fenqideMacBook-Pro:jasmine-test fenqi$ jasmine
Started
.


1 spec, 0 failures
Finished in 0.023 seconds