我试图写一个简单的测试 -
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。
那么,为什么这个测试会抛出错误?
由于
答案 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将您传递的函数包装到it
。 co.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);
}) })