Mocha / Node:如何使用assert.rejects()?

Joã*_*ero 6 javascript mocha.js promise node-assert

我尝试按照文档进行操作,以便使用assert.rejects(我确实有v10以上的Node)来测试错误消息。

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

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

更新:看来如果我返回assert.rejects,它就会起作用。但我还是不知道原因。

Gra*_*ner 11

当我写这篇文章时,上面/之前写的所有内容都是正确的,但其中大部分是不必要的复杂。您必须返回一个 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'}                        
    )
  }
)
Run Code Online (Sandbox Code Playgroud)

这里有三个关键点:

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