摩卡投掷"解决方法被过度指定"

时间:2017-02-07 14:07:23

标签: javascript node.js mocha

我试图写一个简单的测试 -

describe("My test", function(){
  it("Succeed", function*(done){
    yield testFunc();
    done()
  })
})

function *testFunc(){
  console.log("Hey!")
}

请注意,我使用的是co-mocha,以便执行我的生成器。

我得到的错误是 -

Error: Resolution method is overspecified. Specify a callback *or* return a Promise; not both.

现在,文档清楚地说明了 -

  

当一个测试注入一个回调函数(建议异步执行),调用它并返回一个Promise时,Mocha现在会抛出异常

https://github.com/mochajs/mocha/blob/master/CHANGELOG.md#boom-breaking-changes

然而,我没有回复承诺!我正在注入done函数,这是一个回调,但我没有回复承诺......让testFunc没有返回Promise。

那么,为什么这个测试会抛出错误?

由于

3 个答案:

答案 0 :(得分:3)

生成器(function*)或者更确切地说它的协同创建包装器很可能会返回一个promise。我不确定co-mocha如何在这里工作,但也许这会起作用:

describe("My test", function () {
  it("Succeed", function* () {
    yield testFunc();
    return;
  });
});

此处不需要返回,只是为了清晰起见而添加。

但你可能需要改变:

function *testFunc(){
  console.log("Hey!")
}

类似于:

let testFunc = co.wrap(function* () {
  console.log("Hey!");
});

在上面的代码中为yield工作。

如果您正在使用co协同程序,那么您的生成器应该产生承诺。在这里,你的生成器会产生运行生成器函数的结果,该函数本身返回一个生成器,而不是一个promise。

答案 1 :(得分:2)

您认为没有使用承诺的假设是不正确的。 co-mocha使用co.wrap internally将您传递的函数包装到itco.wrap的文档说:

  

将生成器转换为返回Promise的常规函数​​

强调补充。

答案 2 :(得分:0)

删除完成作为参数对我有用!示例如下:

之前:

it('receives successful response', async (done) => { 
const getSomeData = await getResponse(unitData, function callBack(unit, error, data){ 
    expect(data.statusCode).to.be.equal(200); 
    done(); 
}) })

之后(正常):

it('receives successful response', async () => { 
const getSomeData = await getResponse(unitData, function callBack(unit, error, data){
     expect(data.statusCode).to.be.equal(200); 
}) })