【问题标题】:Mocha / Node: how to use assert.rejects()?Mocha / Node:如何使用 assert.rejects()?
【发布时间】:2019-01-18 02:40:15
【问题描述】:

我尝试遵循documentation 以使用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,它会起作用。但我仍然不知道原因。

【问题讨论】:

  • Mocha 中的 Returning a Promise(或使用 done 参数)向它发出测试是异步的信号,因此测试等待 Promise 解决/拒绝。这就是为什么当你返回它时它会起作用。否则,测试会立即运行并在您的 assert.rejects 实际返回结果之前结束。
  • await assert.rejects(..)
  • 你解决了吗?我也不懂文档。
  • 是的,你只需要返回一个承诺。上面的 Nik 给出了解释。

标签: javascript promise mocha.js node-assert


【解决方案1】:

在我写这篇文章时,上面/之前写的一切都是正确的,但其中大部分是不必要的复杂。你必须返回一个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. await assert.rejects 在(异步)测试函数内调用。这会自动使测试函数返回Promise<void>,这正是您想要的。这将重要部分放在了 assert 调用的位置,与手动返回/处理 promise 相比,更容易在其他地方复制/粘贴调用,并且更容易在一个测试中断言多个拒绝。
  3. 不要 await 传递给rejects 调用的内容。您应该传递一个承诺,而不是 awaited 值。

【讨论】:

    【解决方案2】:

    nicholaswmin 说的是对的,但这里有一个“猫头鹰休息”的时刻,我想澄清一下。

    如果您的愿望是:“我想断言拒绝”,“我想确保这段代码以正确的方式拒绝”,那么模式有点复杂。

    首先,写信return fxnWhichReturnsPromise()。如果您的函数拒绝,则测试将失败,而您想要相反的结果。您必须使用.then() 的两个参数签名,它看起来像:.then(onFulfillCallback, onRejectCallback),因为如果将其拆分为.then.catch,则在.then 块中失败将被后续捕获.catch-block,应该是一个失败的测试(它没有拒绝)将是一个通过。

    实际上,它看起来像这样:

    it('rejects when given foobar', () => {
      return fxnThatShouldReject(foobar)
        .then(
          (val) => { assert.fail(`Should have rejected, returned with ${val} instead`)
          ,
          (err) => { assert.equal(err.message, "Rejection reason I was expecting") }
        )
    }) 
    

    断言库没有为此内置断言处理程序的原因是,能够“阻止”测试套件中的异步执行实际上是测试运行程序的能力。相比之下,assert.throws() 是同步的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-06
      • 1970-01-01
      • 2015-08-10
      • 2019-07-18
      • 2016-04-22
      • 2019-06-27
      • 2016-08-26
      • 1970-01-01
      相关资源
      最近更新 更多