异步 Mocha 测试(使用 Chai 断言库)应该失败,但被标记为通过

Posted

技术标签:

【中文标题】异步 Mocha 测试(使用 Chai 断言库)应该失败,但被标记为通过【英文标题】:Async Mocha test (with Chai assertion library) should fail, but is marked as passing 【发布时间】:2017-07-18 12:01:24 【问题描述】:

我已经使用 mocha 测试框架和 chai 断言库在 TypeScript 中编写了一些测试(我对所有这 3 个都是新手),并且看到抛出了一个错误,并且在下面的代码中调用了 assert.fail()。但是,该测试仍被标记为通过。我很困惑为什么会发生这种情况,以及我是否在承诺方面做错了什么。另外,如下图所示,还有一个UnhandledPromiseRejectionWarning。我不明白为什么这被标记为未处理,因为我已经包含了一个 catch 块。我将不胜感激有关如何解决此问题的任何建议,谢谢!

   User.all()
      .then((users) => 
        expect(users.length).to.equal(0);
        return User.create('test@test.email', '12345', 'test', true, true);
      )
      .then(() => 
        return User.all();
      )
      .then((users) => 
        expect(users.length).to.equal(1);
      )
      .catch((error) => 
        assert.fail();
      );

调试控制台

 ✓ should create a new record
  with existing e-mail in the database
(node:29903) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 3): AssertionError: assert.fail()
(node:29903) DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

Code

Debug Console

【问题讨论】:

Users.all 调用之前添加一个return 谢谢!哈哈,我刚想通了,正要发帖,你抢先了。我正在阅读这篇文章 (alisdair.mcdiarmid.org/…),并阅读了“要为此编写测试,请确保您的 it 块返回一个 Promise,而 mocha 将负责其余的工作:” 【参考方案1】:

正如上面的 Benjamin Gruenbaum 所说,通过确保 it 块返回一个承诺来解决这个问题

it('should create a new record', () => 

   return User.all()
      .then((users) => 
        expect(users.length).to.equal(0);
        return User.create('test@test.email', '12345', 'test', true, true);
      )
      .then(() => 
        return User.all();
      )
      .then((users) => 
        expect(users.length).to.equal(1);
      )
     .catch((error) => 
       assert.fail();
     );
 );

【讨论】:

以上是关于异步 Mocha 测试(使用 Chai 断言库)应该失败,但被标记为通过的主要内容,如果未能解决你的问题,请参考以下文章

断言正在破坏 Mocha 测试中的异步功能

Mocha单元测试时出现Cannot find module 'chai'

我如何使用 Mocha 和 Chai 对 Node 创建的端点进行异步测试?

Chai-As-Promised 正在吃断言错误

前端测试框架学习

Spectron,mocha和chai可以声称变量在Electron-app中具有预期值吗?