【问题标题】:Mocha + Chai - no details on errorsMocha + Chai - 没有关于错误的详细信息
【发布时间】:2018-09-02 19:27:28
【问题描述】:

我对 mocha 和 chai 有疑问。我的测试在失败的测试中没有显示错误(例如,预期的“a”为“b”)。 test log

1) Shouldn't publish new post - there is a post with this title
npm ERR! Test failed.  See above for more details.

示例代码:

it('Shouldn\'t publish new post - some required fields are empty', done => {
        request(app)
          .post('/posts')
          .set('Authorization', `Bearer ${token}`)
          .send()
          .end((err, { body }) => {
            if(err) {
              return done(err);
            }

            expect(body).to.have.property('errors');

            return done();
          });
      });

我认为问题不直接在于 mocha 或 chai。我的仓库:github repository.

您需要做的就是克隆 repo,安装依赖项并运行 mongodb。随意创建虚假测试并查看输出。

最好的问候

【问题讨论】:

  • 此断言可能会导致测试运行程序 github.com/sszczep/sCMS-API/blob/master/test/posts.test.js#L113 无法处理的错误。如果它失败了,done 永远不会被调用。它应该用 try..catch 包裹起来。我不确定这是否是这里唯一的问题,但它是其中之一。
  • 所以你说我应该将所有期望包装在 try catch 块中并调用完成但有错误?
  • 在当前状态下,是的。更好的方法是切换到 Promise 并更一致地处理错误。
  • 是否期望返回承诺,以便我可以将 .catch 链接到它?在文档中没有找到任何内容
  • 我将很快发布一个示例。考虑使用导致问题的相关代码更新问题,SO 规则要求问题是可理解的,无需遵循非现场链接。

标签: node.js express testing mocha.js chai


【解决方案1】:

问题在于,由于嵌套回调,错误无法始终如一地处理。如果expect(body)... 断言失败,这将导致异步错误永远不会用done(error) 报告给当前测试,因此所有异步Chai 断言都应该用try..catch 包装。

更好的方法是使用 Mocha 原生支持的 Promise,so does Supertest。这允许在没有done 回调的情况下始终如一地处理错误:

  it('Shouldn\'t publish new post - outdated/wrong token', async () => {
    const { body } = await request(app)
      .post('/posts')
      .set('Authorization', 'Bearer blah_blah_blah')
      .send();

    expect(body).to.have.property('errors');
  });

【讨论】:

  • 嗯,非常感谢你。您的代码不仅看起来更好 - 它还可以正常工作。我不知道期望在失败时会引发错误——现在我很清楚了。再次感谢。
  • 很高兴它有帮助。 expect 在失败时抛出错误 - 这就是所有断言的工作方式。你可以使用 Nodeassert 或者如果你想直接抛出它们,Chai 只是提供了更好的 API 和更有意义的消息。
  • 看来我现在必须重构所有内容;)很高兴你解决了。我第一次写测试。
猜你喜欢
  • 2019-11-16
  • 2022-12-17
  • 2017-08-01
  • 2012-03-19
  • 1970-01-01
  • 2019-03-23
  • 2015-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多