如何使用ava的t.throws来测试返回Promise的函数的错误消息?

时间:2016-12-17 17:37:30

标签: javascript promise ava

我有一个返回Promise的函数。我想为它创建一个测试,要求它拒绝一个特定的错误消息,以便它通过。

我已经创建了一些示例测试来证明我的意思:

import test from 'ava';

const returnsPromise = () => Promise.reject(new Error('foo'));

const awaitsPromise = async () => {
  await Promise.reject(new Error('foo'));
};

test('for comparison, t.throws works with this syntax (this passes)', async t => {
  const error = await t.throws(Promise.reject(new Error('foo')));
  t.is(error.message, 'foo');
});

test('throws works with functions that return promises (this fails)', async t => {
  const error = await t.throws(returnsPromise);
  t.is(error.message, 'foo');
});

test('throws works with async functions that await promises (this fails)', async t => {
  const error = await t.throws(awaitsPromise);
  t.is(error.message, 'foo');
});

作为参考,第一个测试的代码是从这个GitHub评论复制的:https://github.com/avajs/ava/issues/1120#issuecomment-261783315

使用ava --verbose(版本0.17.0)运行时,它会提供以下输出:

❯ ava --verbose test/promise.js

  √ for comparison, t.throws works with this syntax (this passes)
  × throws works with functions that return promises (this fails) Missing expected exception..
  × throws works with async functions that await promises (this fails) Missing expected exception..
Unhandled Rejection: test\promise.js
  Error: foo
    returnsPromise (test/promise.js:3:45)
    _tryBlock (node_modules/core-assert/index.js:311:5)
    _throws (node_modules/core-assert/index.js:330:12)
    Function.assert.throws (node_modules/core-assert/index.js:360:3)
    Test.<anonymous> (test/promise.js:15:25)
    Test.__dirname [as fn] (test/promise.js:14:1)



Unhandled Rejection: test\promise.js
  Error: foo
    test/promise.js:6:24
    awaitsPromise (test/promise.js:5:7)
    _tryBlock (node_modules/core-assert/index.js:311:5)
    _throws (node_modules/core-assert/index.js:330:12)
    Function.assert.throws (node_modules/core-assert/index.js:360:3)
    Test.<anonymous> (test/promise.js:20:25)
    Test.__dirname [as fn] (test/promise.js:19:1)




  2 tests failed [16:55:55]
  2 unhandled rejections


  1. throws works with functions that return promises (this fails)
  AssertionError: Missing expected exception..
    Test.<anonymous> (test/promise.js:15:25)
    Test.__dirname [as fn] (test/promise.js:14:1)


  2. throws works with async functions that await promises (this fails)
  AssertionError: Missing expected exception..
    Test.<anonymous> (test/promise.js:20:25)
    Test.__dirname [as fn] (test/promise.js:19:1)

如您所见,第一次测试通过,但其他两项测试失败。

如何使用t.throws测试返回Promise的函数的错误消息?

3 个答案:

答案 0 :(得分:4)

通过的测试形式为:

test('...', async t => {
    const error = await t.throws(<Promise>);
    t.is(error.message, '...');
});

失败的两个测试形式如下:

test('...', async t => {
    const error = await t.throws(<Function>);
    t.is(error.message, '...');
});

尝试调用函数并将返回的内容传递给t.throws()

例如。 :

test('throws works with functions that return promises (this fails)', async t => {
    const error = await t.throws(returnsPromise());
    t.is(error.message, 'foo');
});

答案 1 :(得分:3)

您可以将承诺传递给Matrix并立即检查错误消息。

t.throws

您的示例将如下所示。

const foo = Promise.reject(new Error('hello world'));

test(async t => {
    await t.throws(foo, 'hello world');
});

答案 2 :(得分:0)

我知道这已经很老了,但是如果有人像我一样迷迷糊糊,Ava现在可以使用built in method throwsAsync来处理此问题:

test('throws', async t => {
    await t.throwsAsync(async () => {
        throw new TypeError('?');
    }, {instanceOf: TypeError, message: '?'});
});