【问题标题】:Why is Mocha returning undefined when testing function that uses a promise?为什么在测试使用 Promise 的函数时 Mocha 返回 undefined?
【发布时间】:2020-03-20 00:37:31
【问题描述】:

在测试使用 Promise 的函数时,我遇到了 Mocha 返回错误结果的问题。不知道为什么它返回“未定义” - 被调用的函数 (testFunction()) 不应该在承诺完成之前返回。

测试:

it('test1', function() {

    let testResult = testFunction();

     assert.equal(testResult,'success');


 });

承诺:

getPromise() {
  return new Promise((resolve, reject) => { 
          resolve('success');
      }
}

testFunction()

testFunction = () => {

               getPromise().then(result => { return result}
      ).catch(error =>{  return error });

         }

结果: AssertionError [ERR_ASSERTION]: undefined == 'success'

【问题讨论】:

  • result => return result 语法无效。
  • 修复了帖子中的语法,但在我的测试中已经正确 - 这不是问题。
  • 问题是testFunction 没有返回任何东西,所以它默认返回undefined。那显然和"success"不一样。
  • 怎么什么都不返回?它在 Promise 回调中有 return 语句。
  • 我对 mocha 了解不多,但我体验过 Jest。对于承诺案例,我通常通过async await

标签: javascript unit-testing mocha.js


【解决方案1】:

testFunction 中没有返回语句,因此它返回未定义。回调中的返回只决定回调返回什么,而不是 testFunction 返回什么。

由于您正在处理 Promise,因此您必须返回一个 Promise。您不能返回字符串,因为该字符串尚不存在。所以,testFunction 可能看起来像这样:

testFunction = () => {
  return getPromise()
    .then(result => { return result })
    .catch(error => { return error });
}

但是这个.then并没有做任何事情,所以除非有一些你没有提到的额外代码,否则它可以被删除:

testFunction = () => {
  return getPromise()
    .catch(error => { return error; });
}

您需要编写测试以期望得到返回的承诺。如果您使用异步函数,这是最简单的,如下所示:

it('test1', async function () {
  let testResult = await testFunction();
  asset.equal(testResult, 'success');
});

或者,您可以使用done 回调来告诉测试您的异步工作何时完成。

it('test1', function (done) {
  let promise = testFunction();
  promise.then(testResult => {
    assert.equal(testResult, 'success');
    done();
  });
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-18
    • 2021-09-16
    • 2015-12-28
    • 1970-01-01
    • 2016-05-26
    • 2019-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多