【问题标题】:Unit Test failing promise单元测试失败的承诺
【发布时间】:2018-06-27 02:47:27
【问题描述】:

我是异步编程的新手。我正在为以下示例代码编写一个测试用例。

someAsync(text) {
  try {
    //do something and resolve result
    return Promise.resolve(result);
  } catch (err) {
    return Promise.reject(new Error(`Failure ${err}`));
  }
}

我正在使用以下代码对其进行测试:

it('should throw error when called', (done) => {
  const mymodule = new MyModule(args);
  mymodule.someAsync('something that causes failure').catch((err) => {
    expect(err).to.exist;
    expect(err.message).to.contains('This should pass');
    done(err);
  });
});

此测试用例失败,断言通过,然后再次完成后抛出错误。 请告诉我哪里出错了?

【问题讨论】:

  • 此测试用例失败,断言通过,然后再次完成后抛出错误 - 不清楚您的意思。如果有错误,请一并列出。未列出测试框架。是摩卡吗?
  • 是的,它的摩卡咖啡。请原谅我的标点符号:) 测试用例在完成后失败(错误)。测试用例失败,并显示与断言相同的错误消息

标签: javascript node.js promise es6-promise chai


【解决方案1】:

done(err) 使规范失败。由于它是预期错误,它不应该不符合规范,它应该是done()

Mocha 不需要done 来处理承诺,可以从规范中返回承诺。

应该是:

it('should throw error when called', () => {
  const mymodule = new MyModule(args);
  return mymodule.someAsync('something that causes failure').catch((err) => {
    expect(err).to.exist;
    expect(err.message).to.contain('This should pass');
  });
});

此外,从列出的代码中看不出expect(err.message).to.contain('This should pass') 断言是真的。

【讨论】:

  • 感谢它的工作。 “这应该通过”具有误导性,我想传达这个测试用例应该通过。无论如何, done() 不是必需的。我删除了它,它起作用了。
  • 不客气。 要么return mymodule.someAsync...done(),前者更可取。
【解决方案2】:

这可能与您的错误有关,也可能无关,但这看起来并不像异步代码。这样的事情可能更有意义:

const someAsync = (text) => new Promise((resolve, reject)) => {
  try {
    // do something and capture result
    resolve(result);
  } catch (err) {
    reject(new Error(`Failure ${err}`));
  }
})

正如 estus 的评论所说,我们可能需要实际错误和测试框架来进一步诊断。

【讨论】:

    猜你喜欢
    • 2016-05-01
    • 1970-01-01
    • 2018-12-28
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    • 1970-01-01
    相关资源
    最近更新 更多