如何用jest捕获错误来测试Redux-Saga

时间:2018-03-23 07:33:27

标签: error-handling generator jestjs redux-saga saga

大家。我用jest框架测试saga。我可以在正常情况下测试我的传奇。但我想测试catch()中的代码,所以我必须模拟一个错误来触发catch。我在redux-saga官方文档和其他stackoverflow答案中找到了一些解决方案。但我还是有问题。

当我在saga.test.js中使用throw()时,如下例所示,它将显示"错误[object object]抛出"。所以它无法通过这个测试。我没有看到有人问同样的问题。谁能帮助我?非常感谢。

错误结果屏幕:

img1

api.js

const api = {
  fetchProductAPI() {
    return 'iphone';
  },
};
export default api;

saga.js

import { call, put } from 'redux-saga/effects';
import api from './api';

export default function* fetchProduct() {
  try {
    yield call(api.fetchProductAPI);
    yield put({ type: 'PRODUCTS_RECEIVED', product: 'iphone' });
  } catch (error) {
    yield put({ type: 'PRODUCTS_REQUEST_FAILED', error });
  }
}

saga.test.js

import { put, call } from 'redux-saga/effects';
import fetchProduct from './saga';
import api from './api';

describe('fetchProduct()', () => {
  it('try', () => {
    const gen = fetchProduct();
    expect(gen.next().value).toEqual(call(api.fetchProductAPI));
    expect(gen.next().value).toEqual(put({ type: 'PRODUCTS_RECEIVED', product: 'iphone' }));
  });
  it('catch', () => {
    const error = 'product not found';
    const gen = fetchProduct();
    expect(
      gen.throw({
        error: 'product not found',
      }).value
    ).toEqual(put({ type: 'PRODUCTS_REQUEST_FAILED', error }));
  });
});

我在下面找到的相关解决方案答案:

Redux-Saga Error Handling

How to test API request failures with Redux Saga?

2 个答案:

答案 0 :(得分:3)

我的朋友帮我解决了这个问题。所以我自己回答我的问题......

我需要在投掷之前添加gen.next()。以下是解决方案代码。

it('catch', () => {
  const error = 'product not found';
  const gen = fetchProduct();
  gen.next(); //add gen.next() before throw
  expect(
    gen.throw('product not found').value).
    toEqual(put({ type: 'PRODUCTS_REQUEST_FAILED', error }));
  });
});

答案 1 :(得分:0)

您可以使用jest-generator轻松地做到这一点。 https://github.com/doniyor2109/jest-generator

it('catch', () => {
  const error = new Error('product not found');

  expect(fetchProduct()).toMatchYields([
    [call(api.fetchProductAPI), error],
    [put({ type: 'PRODUCTS_REQUEST_FAILED', error.message }))]
  ]);
});