如何使用mongoose,mocha和chai编写一个单元测试来插入和检索mongodb对象?

时间:2016-06-25 20:48:01

标签: javascript mongoose promise mocha chai

我正在尝试编写一个单元测试,用于将文档插入(然后检索)到mongodb。但是,我一直收到超时错误,它表明永远不会调用 describe('create and getOneById', () => { it('creates a new checkbookEntry, and retrieves it from the db', (done) => { var EXAMPLE_ENTRY = { type: 'debit', date: Date(), description: 'Example of a cb entry', account: 'PNC', amount: 239.33 }; CheckbookEntry.create(EXAMPLE_ENTRY.type, EXAMPLE_ENTRY.date, EXAMPLE_ENTRY.description, EXAMPLE_ENTRY.account, EXAMPLE_ENTRY.amount) .then(function(createdEntry){ return CheckbookEntry.getOneById(createdEntry._id); }) .then(function(foundEntry){ expect(foundEntry).to.eql(EXAMPLE_ENTRY); done(); }, function(err){ assert.fail(err); done(); }); }).timeout(5000); }); // end describe create 。 (Mongod正在运行,我可以看到插入的对象很好,并且使用console.log进行检索。)

我正在使用的是什么:

Node.js的, ES6, 猫鼬, 摩卡, 柴

CheckbookEntry是一些奇怪的包装,可以让我使用promises。

function ids = mosfet(vgs,vds)
    if vgs>=10
        ids = vds/0.028;
    else
        ids = 0;
    end
end

有关如何使其正常工作的任何建议吗?

1 个答案:

答案 0 :(得分:1)

我只能猜测,但我认为问题可能是由此引起的:

.then(function(foundEntry){
    expect(foundEntry).to.eql(EXAMPLE_ENTRY);
    done();
}, function(err){
    assert.fail(err);
    done();
});

更具体地说,在履行/拒绝处理程序中使用断言而不继续承诺链。

如果断言抛出异常,done()永远不会被调用。根据正在使用的承诺实现,您甚至可能永远不会收到有关异常的通知。此外,onFulFilled处理程序中抛出的异常不会触发传递给相同onRejected方法的.then()处理程序。

因为Mocha supports promises out of the box而不是使用done回调,所以返回您的保证链:

return CheckbookEntry.create(...)
                     .then(...)
                     .then(..., ...);

这样,异常将传播回Mocha,后者将处理它。

FWIW,Mongoose also supports promises out of the box