代码之家  ›  专栏  ›  技术社区  ›  nico

Mocha等待/异步处理(预期)错误

  •  0
  • nico  · 技术社区  · 6 年前

    Mocha async test handle errors )

    现在,我使用await/async对nodejs的新版本进行了相同的尝试。只是一个简单的例子,但是我需要把代码包装成 try / catch 布洛克,事情失控了。

    所以我想找个更好的办法。

    测试如下:

    it('myTest', async function () {
    
      // THIS WORKS => CODE OPTION 1:
      // this works, it uses promises but not await/async
      return somePromiseFunction()
        .then(() => Promise.reject(new Error('Expected method to reject.')))
        .catch(err => assert.ok(err instanceof Error, 'This should be an error!'));
    
    
      // THIS WORKS => CODE OPTION 2:
      // this works, it uses await/async
      let forceFail = false;
      try {
        await somePromiseFunction();
        forceFail = true;
      } catch (err) {}
      if (forceFail) assert.ok(false, 'Expected method to reject.');
    
    
      // WONT WORK => CODE OPTION 3:
      try {
        await somePromiseFunction();
        assert.ok(false, 'you shouln\'t be here');
      } catch (err) {
        assert.ok(err instanceof Error, 'This should be an error!');
      }
    
    });
    

    选项1和选项2都有效。选项1使用经典 Promise.then.catch 语法,没关系。选项2是我使事情正常工作的唯一方法,但理解/维护起来非常复杂。它依赖于一种全局变量和处理状态,看起来不太好。

    代码中有一个选项3,但它不起作用。类似的东西很容易阅读,但它根本不起作用,不是第一个断言,也不是第二个断言。

    如果您删除 尝试/抓住 封锁,那也行不通。

    谢谢。

    2 回复  |  直到 6 年前
        1
  •  0
  •   Mehmet Baker    6 年前

    在第三种选择中, err 永远都是 undefined e ,而不是 错误 未定义 不是的实例 Error

        2
  •  0
  •   nico    6 年前

    我找到了一种方法,但是您需要升级到节点版本10。我使用的是8,但是assert中包含的这个新特性以一种优雅的方式解决了我的问题。

    而不是尝试:

    // WONT WORK => CODE OPTION 3:
    try {
      await somePromiseFunction();
      assert.ok(false, 'you shouln\'t be here');
    } catch (err) {
      assert.ok(err instanceof Error, 'This should be an error!');
    }
    

    执行以下操作:

    // this works!
    await assert.rejects(
      async () => somePromiseFunction(),
      Error
    );
    

    Error 就够了。

    async () => 不是很有必要,我最终得到了一个单行断言(第二个参数是可选的,但我宁愿保留它):

    await assert.rejects(somePromiseFunction(), Error);