开玩笑 - 断言异步函数抛出测试失败

Posted

技术标签:

【中文标题】开玩笑 - 断言异步函数抛出测试失败【英文标题】:Jest - assert async function throws test fails 【发布时间】:2020-03-11 10:15:26 【问题描述】:

得到以下失败的测试用例,我不知道为什么:

foo.js

async function throws() 
  throw 'error';


async function foo() 
  try 
    await throws();
   catch(e) 
    console.error(e);
    throw e;
  

test.js

const foo = require('./foo');

describe('foo', () => 
  it('should log and rethrow', async () => 
    await expect(foo()).rejects.toThrow();
  );
);

我希望 foo 抛出,但由于某种原因它只是解决了并且测试失败了:

FAILED foo › should log and rethrow - Received function did not throw

Live example

可能缺少异步等待抛出行为的一些基本细节。

【问题讨论】:

不要等待它......只是expect(foo()).rejects.toThrow(); = 因为 foo 所做的只是返回一个拒绝的承诺...... @Bravo 这只是隐藏了问题,因为测试不等待结果。 是的,我明白了......但你不希望(await foo()) 代替吗?我头晕了:p @Bravo 是的,这很令人困惑,但这是测试抛出异步函数的方法:) https://***.com/a/47887098/4341456 【参考方案1】:

似乎这是一个已知的错误:https://github.com/facebook/jest/issues/1700

这可行:

describe('foo', () => 
  it('should log and rethrow', async () => 
    await expect(foo()).rejects.toEqual('error')
  );
);

【讨论】:

【参考方案2】:

我认为您需要检查被拒绝的错误

const foo = require('./foo');
describe('foo', () => 
  it('should log and rethrow', async () => 
    await expect(foo()).rejects.toEqual('error');
  );
);

【讨论】:

谢谢,不是 100% 确定它与投掷测试相同,但我想这是下一个最好的事情。最终选择了await expect(foo()).rejects.toBeTruthy(); 您还可以将您的代码调整为类似并且应该可以工作:async function throws() throw new Error('error'); 谢谢!由于某种原因,手动抛出错误需要不同的语法【参考方案3】:

当我不想使用 toEqualtoBe 时,我会使用此代码(就像其他正确答案一样)。相反,我使用toBeTruthy

async foo() 
  throw "String error";


describe('foo', () => 
  it('should throw a statement', async () => 
    await expect(foo()).rejects.toBeTruthy();
  );
);

【讨论】:

以上是关于开玩笑 - 断言异步函数抛出测试失败的主要内容,如果未能解决你的问题,请参考以下文章

开玩笑:测试不能在 setImmediate 或 process.nextTick 回调中失败

为啥 GHUnit 的异步测试中的错误断言会使应用程序崩溃,而不仅仅是测试失败?

开玩笑的测试在调用模拟的 firebase 函数之前完成,因此失败

解决用try except 捕获assert函数产生的AssertionError异常时,导致断言失败的用例在测试报告中通过的问题

Mocha,应该 - 在测试具有承诺的异步函数时,断言错误是沉默的

使用 mocha 和 chaiAsPromised 测试异步函数时的断言错误