这个问题不是关于我无法解决的问题,只是出于好奇。我对Mocha的经验不是很丰富,但是我偶然发现了一些有趣的东西。
我想要的是使用done()告诉摩卡,诺言已经解决。
以下代码无效:
beforeEach((done) => {
user = new User({ name: 'Dummy' })
user.save()
.then(done)
})
我知道我正在传递user.save()承诺要完成的结果,但是我认为这应该不是问题。
相反,此其他代码有效:
beforeEach((done) => {
user = new User({ name: 'Dummy' })
user.save()
.then(() => done())
})
在我看来,Mocha done()具有某种控制流程,它导致:错误:用非错误调用了done():{“ _id”:“ 5b65b9d2669f7b2ec0a3d503”,“ name”:“假人”,“ __ v”:0}
是因为done()严格要求错误作为参数吗?
为什么done()甚至关心我传递给它的内容?
您能举个例子说明为什么done()参数是错误的吗?
预先感谢;)
答案 0 :(得分:1)
这是因为Mocha中的done()
仅接受Error参数。就您而言,您的save()
方法返回的json对象不是错误,即new Error('failed save')
。
如果我们看一下mocha测试文件,我们会发现它不接受其他类型的参数。
// https://github.com/mochajs/mocha/blob/master/test/unit/runnable.spec.js#L358
describe('when done() is invoked with a string', function () {
it('should invoke the callback', function (done) {
var test = new Runnable('foo', function (done) {
done('Test error'); // specify done with string/text argument
});
test.run(function (err) {
assert(err.message === 'done() invoked with non-Error: Test error');
done();
});
});
});
但是,如果我们在参数为Error的情况下看到测试,那就可以了
// https://github.com/mochajs/mocha/blob/master/test/unit/runnable.spec.js#L345
describe('when an error is passed', function () {
it('should invoke the callback', function (done) {
var test = new Runnable('foo', function (done) {
done(new Error('fail'));
});
test.run(function (err) {
assert(err.message === 'fail');
done();
});
});
});
顺便说一句,我建议您避免使用done
,因为mocha通过指定return
语句来支持promise。因此,我们将代码更改为
beforeEach(() => {
user = new User({ name: 'Dummy' })
return user.save().then(user => {
// antyhing todo with user
});
});
希望有帮助。