摩卡测试失败,请确保调用了don()

时间:2018-11-14 15:18:55

标签: javascript node.js unit-testing mocha

嗨,我在使用Mocha测试代码时遇到了奇怪的问题:

  

错误:超时超过2000毫秒。对于异步测试和挂钩,请确保调用了“ done()”;如果返回一个Promise,请确保它可以解决

这是代码:

describe('POST /notes', () => {
it('should create new note', (done) => {
    const title = 'Test title';
    const text = 'Test text';
    const category = 'Test category';
    request(app)
        .post('/notes')
        .send({title, text, category})
        .expect(200)
        .expect(res => {
            expect(res.body.title).toBe(title);
        })
        .end((err, res) => {
            if (err)
                return done(err);

            Note.find({text: text}).then(notes => {
                 expect(notes.length).toBe(1);
                 expect(notes[0].title).toBe(title);
                done();
            }).catch(err => done(err));
        });
});
it('should not create new note with invalid body data', done => {
    request(app)
        .post('/notes')
        .send({})
        .expect(400)
        .end((err, res) => {
            if (err)
                return done(err);

            Note.find().then(notes => {
                expect(notes.length).toBe(notesDummy.length);
                done();
            }).catch(err => done(err));
        });
})

});

首次测试失败,并出现上述错误。谈到第二个,它就过去了。两种测试都很相似,我不知道自己缺少什么...有什么想法吗?

2 个答案:

答案 0 :(得分:0)

如果您正在与实时数据库进行交互,则此操作可能需要2秒钟以上的时间才能完成。如果在与数据库进行交互之前进行服务器端验证,则成功操作的测试将比否定测试花费更长的时间。

您可以使用mochathis.timeout(<some number in milliseconds>)中延长超时时间:

it('should create new note', (done) => {
    this.timeout(9000); // set it to something big to see if it fixes your issue
    const title = 'Test title';
    const text = 'Test text';
    const category = 'Test category';
    request(app)
        .post('/notes')
        .send({title, text, category})
        .expect(200)
        .expect(res => {
            expect(res.body.title).toBe(title);
        })
        .end((err, res) => {
            if (err)
                return done(err);

            Note.find({text: text}).then(notes => {
                 expect(notes.length).toBe(1);
                 expect(notes[0].title).toBe(title);
                done();
            }).catch(err => done(err));
        });
});

我唯一想到的另一件事是您的服务器端代码挂在某个地方并且没有发送响应(或者Notes.find()由于某种原因没有解决或拒绝)。您的测试代码对我来说不错。

答案 1 :(得分:0)

我不确定百分百起初expect出现在承诺地之外时会导致done被调用:

    .expect(200)
    .expect(res => {
        expect(res.body.title).toBe(title);
    })

也许添加一些日志记录以查看它是否曾经到达您的.end处理程序?

此外,您要导入什么以根据请求获取.expect方法?我们应该查看其文档,以了解有关done钩子的信息。