首页 > 解决方案 > Mocha / Node:如何使用 assert.rejects()?

问题描述

我尝试遵循文档以使用 assert.rejects 测试错误消息(我确实有高于 v10 的节点)。

但它总是会过去,即使是一个荒谬的信息。我究竟做错了什么?

it("should fail but it's not", 
  async ()=> {
    let itemId = 'not an id'
    assert.rejects( 
      await ListRepo.checkById(itemId),
      {message: 'abracadabra'}                        
    )
  }
)

更新:似乎如果我返回 assert.rejects,它会起作用。但我仍然不知道原因。

标签: javascriptpromisemocha.jsnode-assert

解决方案


在我写这篇文章时,上面/以前写的所有内容都是正确的,但其中大部分都是不必要的复杂。你必须返回一个promise是正确的,这样mocha本身就有东西等待,否则它会立即返回(在你的promise可以解决或拒绝之前)。缺少的部分是手动等待一个承诺很少是你真正想要在这里做的。

@caub 在评论中暗示了这种最简单的模式——等待assert.rejects. 具体来说:

it("should fail but it's not", 
  async ()=> {
    let itemId = 'not an id'
    await assert.rejects( 
      ListRepo.checkById(itemId),
      {message: 'abracadabra'}                        
    )
  }
)

这里有三个关键点:

  1. 测试函数本身必须是async.
  2. awaitassert.rejects(异步)测试函数内部的调用。这会自动使测试函数 return Promise<void>,这正是您想要的。这将重要的部分放在了 assert 调用的位置,与手动返回/处理 promise 相比,更容易在其他地方复制/粘贴调用,并且更容易在一个测试中断言多个拒绝。
  3. 不要将 await您传递给rejects呼叫的内容。你应该传入一个承诺——而不是一个awaited 值。

推荐阅读