Mocha .then(完成)无法按预期工作

时间:2018-08-04 15:01:08

标签: mocha es6-promise

这个问题不是关于我无法解决的问题,只是出于好奇。我对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()参数是错误的吗?

预先感谢;)

1 个答案:

答案 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
  });
});

希望有帮助。