assert.rejects()

添加的版本:2.5.0

说明

rejects( promise, message = "" )
rejects( promise, expectedMatcher, message = "" )

测试提供的 Promise 是否拒绝,并可选择比较拒绝值。

名字 说明
promise(然后可用) 承诺测试拒绝
expectedMatcher 拒绝值匹配器
message(字符串) 断言的简短说明

在测试预期会根据一组特定情况返回拒绝承诺的代码时,请使用 assert.rejects() 进行测试和比较。

expectedMatcher 参数可以是:

  • 当断言应被视为通过时返回 true 的函数。
  • 错误对象
  • 使用 ala rejectionValue instanceof expectedMatcher 的基本构造函数
  • 匹配(或部分匹配)rejectionValue.toString() 的 RegExp

注:为避免混淆messageexpectedMatcher, 这expectedMatcher 不能成为一个字符串。

例子

QUnit.test('rejects example', assert => {
  // simple check
  assert.rejects(Promise.reject('some error'));

  // simple check
  assert.rejects(
    Promise.reject('some error'),
    'optional description here'
  );

  // match pattern on actual error
  assert.rejects(
    Promise.reject(new Error('some error')),
    /some error/,
    'optional description here'
  );

  // Using a custom error constructor
  function CustomError (message) {
    this.message = message;
  }
  CustomError.prototype.toString = function () {
    return this.message;
  };

  // actual error is an instance of the expected constructor
  assert.rejects(
    Promise.reject(new CustomError('some error')),
    CustomError
  );

  // actual error has strictly equal `constructor`, `name` and `message` properties
  // of the expected error object
  assert.rejects(
    Promise.reject(new CustomError('some error')),
    new CustomError('some error')
  );

  // custom validation arrow function
  assert.rejects(
    Promise.reject(new CustomError('some error')),
    (err) => err.toString() === 'some error'
  );

  // custom validation function
  assert.rejects(
    Promise.reject(new CustomError('some error')),
    function (err) {
      return err.toString() === 'some error';
    }
  );
});

assert.rejects() 方法返回一个Promise,它处理测试成功和失败的(通常是异步的)解决和拒绝逻辑。不需要 await 返回值,因为 QUnit 在内部为您处理异步控制并等待稳定状态。但是,如果您的测试代码需要在 rejects 调用之间保持一致且更加孤立的状态,则应明确等待以阻止下一个语句。

QUnit.test('stateful rejects example', async assert => {
  let value;

  // asynchronously resolve if value < 5, and reject otherwise
  function asyncChecker () {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        if (value < 5) {
          resolve();
        } else {
          reject('bad value: ' + value);
        }
      }, 10);
    });
  }

  value = 8;
  await assert.rejects(asyncChecker(), /bad value: 8/);

  // if the above was not awaited, then the next line would change the value
  // before the previous assertion could occur, and would cause a test failure
  value = Infinity;
  await assert.rejects(asyncChecker(), /bad value: Infinity/);
});