Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 尝试从jest单元测试连接到mongo时超时_Node.js_Mongodb_Unit Testing_Mongoose_Jestjs - Fatal编程技术网

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

Node.js 尝试从jest单元测试连接到mongo时超时,node.js,mongodb,unit-testing,mongoose,jestjs,Node.js,Mongodb,Unit Testing,Mongoose,Jestjs,我想用jest和mongoose编写一些单元测试,以验证与mongo的数据交互 我不想在这里模拟mongoose,因为我特别想验证mongo文档的创建/修改/处理方式 package.json被配置为使节点模块保持未锁定状态: { "jest": { "unmockedModulePathPatterns": [ "node_modules" ] } } 在实际测试中,我设置了一个beforeAll()hook来连接mongo: const mongoose

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

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

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

{
  "jest": {
    "unmockedModulePathPatterns": [
      "node_modules"
    ]
  }
}
在实际测试中,我设置了一个
beforeAll()
hook来连接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
测试每次都会超时,因为在
beforeAll()
hook中从来没有调用过
done()
,没有抛出错误,也没有向控制台打印任何内容。我可以在
beforeAll()
hook中放置断点,以验证代码是否正在运行。似乎mongoose在试图打开与Mongo的连接时挂起,然后jest测试超时

当我在jest环境之外运行类似的代码时,它会按预期进行连接(几乎立即打开)。我怀疑这可能会引起问题,尝试完全禁用jest的automock功能,但行为保持不变

我想我错过了一些非常明显的事情。。。你知道会发生什么吗

  • 开玩笑。0.10.0
  • 猫鼬。4.4.11
更新:

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

开玩笑的茉莉花不同于
您使用的语法实际上属于Jasmine 2.0+,而不是Jest Jasmine。因此,如果您想继续使用jest,您必须查看jest文档以找到答案。
更重要的是,“beforeAll”不是一个标准的玩笑注入变量,请参见

我用Jasmine 2.3.4运行了你的代码,运行得很好。我开玩笑地试图完成这项工作,但失败了

首先

以下是我的目录结构:

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

./spec:
mongodbspec.js  support/

./spec/support:
jasmine.json
然后,编辑spec/mongodbsec.js,我只需在代码中添加一行“'use strict';”

'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

有点长,但您是否尝试使用函数(done)而不是ES6 arrow语法?有一些细微的差别。你能试试下面吗<代码>它('hassomeproperty',(done)=>{//应该通过,但实际上永远不会运行,除了(1).toBe(1);done();})谢谢-尝试了这两个建议但均无效,将添加到我的描述中。尝试将
mongoose.connect
移动到
db.once('open')
下面的
db.once('connected')
,如果没有帮助,请将
db.once('open')
替换为
db.on('connected'))
@AlexanderMac-尝试过,也没有什么不同。感谢您的关注-知道我的代码没有明显损坏确实有帮助!请原谅,你在回答另一个问题:)。我知道Jest使用了一种不同味道的茉莉花,这些钩子在技术上是没有文档记录的(但它们确实有效)。我想利用Jest的内置automock和覆盖率等功能。很抱歉,这并没有解决您的问题。也许你可以通过hack Jest来支持这种语法,但正如我所尝试的,它可能会变得复杂。
fenqideMacBook-Pro:jasmine-test fenqi$ jasmine
Started
.


1 spec, 0 failures
Finished in 0.023 seconds