使用 Mocha 进行测试时,我在运行 server.test.js
时遇到以下错误1)“在每个”钩子之前“应该得到所有待办事项”:
错误:超出2000毫秒的超时。对于异步测试和挂钩,确保调用“done()”;如果返回Promise,请确保它已解决。
server.test.js
const expect = require('expect');
const request = require('supertest');
const {app} = require('./../server');
const {Todo} = require('./../todos');
const todos = [
{
text: 'This is text 1'
},
{
text: 'This is text 2'
}
];
beforeEach((done) => {
Todo.remove({}).then(() => {
return Todo.insertMany(todos);
}).then(() => done());
});
describe('GET /todos', () => {
it('should get all todos', (done) => {
request(app)
.get('/todos')
.expect(200)
.expect(res => {
expect(res.body.length).toBe(2);
})
.end(done);
});
});
但如果我在 beforeEach()方法中做了一些更改,例如:
更新了server.test.js
const expect = require('expect');
const request = require('supertest');
const {app} = require('./../server');
const {Todo} = require('./../todos');
const todos = [
{
text: 'This is text 1'
},
{
text: 'This is text 2'
}
];
beforeEach((done) => {
Todo.remove({}).then(() => {
Todo.insertMany(todos);
done();
})
});
describe('GET /todos', () => {
it('should get all todos', (done) => {
request(app)
.get('/todos')
.expect(200)
.expect(
expect(res.body.length).toBe(2);
})
.end(done);
});
});
然后我没有错误。基本上,通过在 beforeEach()方法中链接promises,我遇到了一个错误,但没有一切都很好。 谁能解释为什么会这样?
server.js
var express = require('express');
var body_parser = require('body-parser');
const {mongoose} = require('./mongoose.js');
const {Todo} = require('./todos');
const {Todo_1} = require('./todos');
var app = express();
app.use(body_parser.json());
// using GET method
app.get('/todos', (req, res) => {
Todo.find().then((todos) => {
res.send(todos);
}, (err) => {
res.status(400).send(err);
});
});
module.exports = {app}
app.listen(3000, () => {
console.log('Server is up on the port 3000');
})
答案 0 :(得分:1)
这是处理承诺的错误方法:
Todo.remove({}).then(() => {
Todo.insertMany(todos);
done();
})
});
Todo.insertMany
可能是异步的,并返回一个承诺,它与承诺链分离。如果有错误,它们将导致未处理的拒绝承诺,并且由于测试依赖于插入的行,这将导致竞争条件:
错误:超出2000毫秒超时。对于异步测试和挂钩,请确保" done()"叫做;如果返回Promise,请确保它已解决。
正是它所说的。 done
要么未被调用,要么已超时。 done
永远不可能被调用,因为错误没有得到处理。它应该是.then(done, done)
。
由于Mocha支持承诺,正确的方法是:
beforeEach(() =>
Todo.remove({})
.then(() => Todo.insertMany(todos))
);
应该返回承诺链中出现的每个承诺。
答案 1 :(得分:0)
而不是像这样将localhost放在url中: “ mongodb:// localhost:27017 / yourDbName”
使用127.0.0.1,结果如下:
“ mongodb://127.0.0.1:27017 / yourDbName”
我不知道此解决方案背后的原因是什么,但是服务器似乎需要一些时间来处理并弄清本地主机的IP是什么。
希望该解决方案可以解决您的问题。