繁体   English   中英

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

[英]Mocha test fail ensure don() is called

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

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

这是代码:

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秒钟以上的时间才能完成。 如果在与数据库进行交互之前进行服务器端验证,则成功操作的测试将比否定测试花费更长的时间。

您可以使用this.timeout(<some number in milliseconds>)来延长mocha的超时时间:

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()由于某种原因未解决或拒绝)。 您的测试代码对我来说看起来不错。

我不是100%确信在开始时诺言域之外的expect s如果失败将导致done被调用:

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

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

另外,您要导入什么以根据请求获取.expect方法? 我们应该查看其文档以了解done挂钩。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM