如何用开玩笑处理错误
#教程 #node #测验 #jest

议程

  1. 这篇文章的目标
  2. 期望。发言(编号)而不是完成()
  3. 拒绝而不是try-catch
  4. 用例1:处理函数中的错误
  5. 用例2:处理异步函数中的错误
  6. 参考

1.这篇文章的目标

这篇文章的目的是为您提供一种如何用开玩笑处理错误的自信方法。由于包括官方指南在内的一堆来源提出了各种方式(但每种方式都有自己的规则符合ð€),因此它会误导测试。

2.期望。发表(编号)而不是完成()

tocred.assertions()和done()用于测试异步函数。但是,Expect.Servions()专注于验证在完成()时都会在测试期间调用一定数量的断言(),以等待一定的断言。因此,如果未完成()未拨打期望的数量,则会失败()由于超时而失败(大多数是从末尾不调用())。

让我们在做异步调用时进行比较()和期望。

API - expect.assertions(number)

确保添加期望。发表以验证调用一定数量的断言。否则,实现的诺言将不会失败。

test('doAsync calls both callbacks', () => {
  expect.assertions(2);
  function callback1(data) {
    expect(data).toBeTruthy();
  }
  function callback2(data) {
    expect(data).toBeTruthy();
  }

  doAsync(callback1, callback2);
});

vs。

Testing Asynchronous Code - callbacks

done()是必要的。否则,在fetchdata完成后,在调用回调之前,该测试将立即完成。

test('the data is peanut butter', done => {
  function callback(error, data) {
    if (error) {
      done(error);
      return;
    }
    try {
      expect(data).toBe('peanut butter');
      done();
    } catch (error) {
      done(error);
    }
  }

  fetchData(callback);
});

您可能会发现完成(错误)在捕获块中声明(错误)以避免超时。一方面,您可以轻松地注意到错误并减少时间来弄清楚这样做的问题。另一方面,您可以轻松地忘记需要正确声明()的位置。

这里的拇指规则是声明期望。在测试开始时发表(编号)。它根本不会引起问题。

3.。拒绝而不是try-catch

API - .rejects

使用。拒绝以解开拒绝承诺的原因,以便可以将任何其他匹配者束缚。如果承诺实现了,则断言失败了。

test('rejects to octopus', async () => {
  await expect(Promise.reject(new Error('octopus'))).rejects.toThrow('octopus');
});

vs。

Stack Overflow

您必须在捕获块上处理错误。

it('calls the API and throws an error', async () => {
  expect.assertions(2);
  try {
    await login('email', 'password');
  } catch (error) {
    expect(error.name).toEqual('Unauthorized');
    expect(error.status).toEqual(401);
  }
});

您知道测试应该导致错误。 .redjects()的关键点是,当承诺实现时,断言会失败。

!CAUTION
请确保返回(或等待)承诺 - 如果您省略了退货/等待声明,则您的测试将在FetchData退还或拒绝的承诺退还之前完成。

!tip
期望。不需要使用。拒绝时,建议在测试期间验证一定数量的断言。

4.。

您可以提供一个可选的参数来测试是否抛出了特定错误,例如Regex,String,错误对象和错误类。但是,tomatch和toe eere只做一件事:匹配一个字符串并等于对象。

API - .toThrow

test('throws on octopus', () => {
  expect(() => {
    drinkFlavor('octopus');
  }).toThrow();
});

Stack Overflow

test("Test description", () => {
  const t = () => {
    throw new TypeError("UNKNOWN ERROR");
  };
  expect(t).toThrow(TypeError);
  expect(t).toThrow("UNKNOWN ERROR");
});

!tip
您必须将代码包裹在功能中,否则不会捕获错误,并且断言将失败。

!提示
您无需包装承诺功能。只是调用它。
Code Example

test('the fetch fails with an error', async () => {
  await expect(fetchData()).rejects.toMatch('error');
});

5.用例1:处理函数中的错误

让我们将我们学到的知识集成到简单的代码段中。

test("Test description", () => {
  expect.assertions(2);
  const t = () => {
    throw new TypeError("UNKNOWN ERROR");
  };
  expect(t).toThrow(TypeError);
  expect(t).toThrow("UNKNOWN ERROR");
});
  • 我声明了期望。发出(数字)即使上述测试不是异步的。没关系,因为Expect.assertions()根本不会引起问题。
  • 我使用.tothrow()而不是.toMatch或.to.to.totore,因为它处理了错误对象和字符串。

6.用例2:处理异步功能中的错误

test('the fetch fails with an error', async () => {
  expect.assertions(1);
  await expect(fetchData()).rejects.toThrow('error');
});
  • 我声明了期望。发出(编号),即使使用.rejects()。
  • 时不需要。
  • 我通过在一个块中而不是在trycatch块中使用.REPENTS来处理一个错误。
  • 我使用的是.tothrow而不是.tomatch或.toe equal。

7.参考