在Jest中,我怎样才能使测试失败?

时间:2017-02-11 13:51:34

标签: javascript jestjs

我知道我可以在测试中抛出错误,但我想知道是否有像Jasmine提供的全局def num_to_excel_col(n): if n < 1: raise ValueError("Number must be positive") result = "" while True: if n > 26: n, r = divmod(n - 1, 26) result = chr(r + ord('A')) + result else: return chr(n + ord('A') - 1) + result 方法?

8 个答案:

答案 0 :(得分:12)

你可以通过抛出错误来做到这一点。例如:

test('Obi-Wan Kenobi', () => {
  throw new Error('I have failed you, Anakin')
})

答案 1 :(得分:6)

复制/面试失败:

it('This test will fail', done => {
  done.fail(new Error('This is the error'))
})

答案 2 :(得分:3)

不要认为有,在这里讨论:https://github.com/facebook/jest/issues/2129

答案 3 :(得分:3)

这里有很多好主意。仅添加有关测试异步代码的额外信息(可能会导致尝试使Jest显式失败),请检查文档中的Testing Asynchronous Code https://jestjs.io/docs/en/asynchronous

要测试返回已解决的Promise的函数,重要的是要返回Promise,因此Jest知道只有在Promise被解决或超时时才进行测试:

test('the data is peanut butter', () => {
  return fetchData().then(data => {
    expect(data).toBe('peanut butter')
  })
})

要测试返回拒绝的Promise的函数,重要的是返回Promise,因此Jest知道只有在Promise被拒绝或超时时才进行测试。而且还必须说Jest需要计数多少个断言,否则如果Promise被解决,它不会失败-在这种情况下,这是错误的-

test('the fetch fails with an error', () => {
  expect.assertions(1)
  return fetchData().catch(e => expect(e).toMatch('some specific error'))
})

答案 4 :(得分:2)

您可以随时执行以下操作:)

expect(true).toBe(false);

答案 5 :(得分:1)

Jest实际上使用Jasmine,因此您可以像以前一样使用fail。这是Jest的TypeScript声明文件中的定义:

declare function fail(error?: any): never;

通话示例:

fail('it should not reach here');

答案 6 :(得分:1)

添加 jest-fail-on-console npm 包,然后添加到 jest.config.js

import failOnConsole from 'jest-fail-on-console'

failOnConsole();

一旦由于测试项中抛出的错误或警告而出现控制台错误或 jest 发出的警告,这将使测试失败。

答案 7 :(得分:0)

在某些情况下,某些答案不起作用。在async-await的世界中,像这样的try-catch逻辑很普遍。

try {
  await someOperation();
} catch (error) {
  expect(error.message).toBe('something');
}

现在想象一下,如果someOperation()以某种方式通过了,但是您期望它失败,那么该测试将仍然通过,因为它从未进入过catch块。 所以我们要确保在someOperation没有引发错误的情况下测试失败。

所以现在让我们看看哪些解决方案将起作用,哪些将不起作用。

可接受的答案在这里行不通,因为将再次引发罚球。

try {
  await someOperation();
  throw new Error('I have failed you, Anakin');
} catch (error) {
  console.log('It came here, and so will pass!');
}

带有true === false的答案也将不起作用,因为断言也会引发类似上面的错误,而该错误将被捕获。

try {
  await someOperation();
  expect(true).toBe(false); // This throws an error which will be catched.
} catch (error) {
  console.log('It came here, and so will pass!');
}

下面是这种情况的一种可行的解决方案(如@WhatWouldBeCool的答案所示)。现在,它明显无法通过测试。

try {
  await someOperation();
  fail('It should not have come here!')
} catch (error) {
  console.log('It never came here!');
}