【发布时间】:2016-07-25 06:09:06
【问题描述】:
我想用 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
测试每次都会超时,因为在 beforeAll() 钩子中从未调用过 done() - 没有抛出错误,也没有任何内容打印到控制台。我可以在beforeAll() 挂钩中放置断点来验证代码正在运行。似乎 mongoose 在尝试打开与 Mongo 的连接时挂起,然后开玩笑的测试超时。
当我在 jest 环境之外运行类似代码时,它会按预期连接(几乎立即启动)。怀疑这可能会导致问题,我尝试完全禁用 jest 的 automock 功能,但行为保持不变。
我想我错过了一些非常明显的事情......有什么想法会发生什么吗?
- jest-cli v. 0.10.0
- 猫鼬 v. 4.4.11
更新:
- 尝试将 ES6 箭头函数语法替换为纯
function(done) {}。没有区别。 - 尝试通过传递
done参数使测试异步,并在测试完成时调用它。没有区别。 - 在声明
error和connected事件处理程序后尝试调用mongoose.connect() - 尝试注释掉所有与 mongoose 相关的代码,以检查
beforeAll()挂钩是否正常工作 - 确实如此。
【问题讨论】:
-
有点远射,但您是否尝试过使用 function(done) 而不是 ES6 箭头语法?有一些细微的差别。
-
你可以试试下面吗?
it('has some property', (done) => { // should pass but actually never gets run expect(1).toBe(1); done(); }); -
谢谢 - 尝试了这两个建议都无济于事,将添加到我的描述中。
-
尝试将
mongoose.connect移到db.once('open')下方,如果没有帮助,请将db.once('open')替换为db.on('connected')。 -
@AlexanderMac - 试过了也没什么区别。
标签: node.js mongodb unit-testing mongoose jestjs