我想用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的连接时挂起,然后开玩笑测试超时。
当我在开玩笑环境之外运行类似的代码时,它会按预期连接(即刻连接)。怀疑它可能导致问题,我已经尝试完全禁用了开玩笑的自动插件功能,但行为保持不变。
我想我已经错过了一些非常明显的东西......任何想法可能会发生什么?
更新
function(done) {}
替换ES6箭头函数语法。没有区别。done
参数使测试异步,并在测试完成时调用它。没有区别。mongoose.connect()
和error
事件处理程序connected
beforeAll()
挂钩是否正常工作 - 确实如此。答案 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