Как протестировать Failure Action в Jest с помощью runSaga - PullRequest
0 голосов
/ 11 июня 2019

Я проверил успешный ответ, но у меня проблемы с ошибочным ответом.

Вот действие:

export function* searchSaga({ searchParams }) {
  try {
    const { text, customers, searchField } = searchParams;
    const results = customers.filter(c => c[searchField] === text);
    yield put({
      type: "CUSTOMER_SEARCH_SUCCESS",
      results
    });
  } catch (error) {
    yield put({
      type: "CUSTOMER_SEARCH_FAILURE",
      error
    });
  }
}

Тест на успешность пройден:

  const initialAction = { type: "SEARCH_CUSTOMERS_START", searchParams };
  it("searches customers with a saga", async () => {
    const dispatched = await recordSaga(searchSaga, initialAction);
    const expectedAction = {
      type: "CUSTOMER_SEARCH_SUCCESS",
      results: [customers[0]]
    };
    expect(dispatched).toContainEqual(expectedAction);
  });

Однако, когда я пытаюсь проверить неудачу, выкидываю ошибкув моём издевательстве мешает:

it("returns an error on a failure", async () => {
    const error = new Error("uh oh!");
    Array.prototype.filter = jest.fn();
    Array.prototype.filter.mockImplementation(() => throw error);
    const dispatched = await recordSaga(searchSaga, initialAction);
    const expectedAction = { type: "CUSTOMER_SEARCH_FAILURE", error };
    console.log(dispatched);
    expect(dispatched).toContainEqual(expectedAction);
  });

Вывод этого теста включает сгенерированную ошибку, однако консоль показывает, что было также отправлено правильное действие при сбое!

 ● Console

    console.log __tests__/CustomerSearch.test.js:48
      [ { type: 'CUSTOMER_SEARCH_FAILURE',
          error:
           Error: uh oh!
               at _callee2$ (/Users/TuzMacbookPro2017/Development/QMG-local/APPS/QMGProzReviews/__tests__/CustomerSearch.test.js:43:19)
               at tryCatch (/Users/TuzMacbookPro2017/Development/QMG-local/APPS/QMGProzReviews/node_modules/@babel/runtime/node_modules/regenerator-runtime/runtime.js:45:40)
               at Generator.invoke [as _invoke] (/Users/TuzMacbookPro2017/Development/QMG-local/APPS/QMGProzReviews/node_modules/@babel/runtime/node_modules/regenerator-runtime/runtime.js:271:22)
               at Generator.prototype.(anonymous function) [as next] (/Users/TuzMacbookPro2017/Development/QMG-local/APPS/QMGProzReviews/node_modules/@babel/runtime/node_modules/regenerator-runtime/runtime.js:97:21)
               at tryCatch (/Users/TuzMacbookPro2017/Development/QMG-local/APPS/QMGProzReviews/node_modules/@babel/runtime/node_modules/regenerator-runtime/runtime.js:45:40)
               at invoke (/Users/TuzMacbookPro2017/Development/QMG-local/APPS/QMGProzReviews/node_modules/@babel/runtime/node_modules/regenerator-runtime/runtime.js:135:20)
               at /Users/TuzMacbookPro2017/Development/QMG-local/APPS/QMGProzReviews/node_modules/@babel/runtime/node_modules/regenerator-runtime/runtime.js:170:11
               at tryCallTwo (/Users/TuzMacbookPro2017/Development/QMG-local/APPS/QMGProzReviews/node_modules/promise/lib/core.js:45:5)
               at doResolve (/Users/TuzMacbookPro2017/Development/QMG-local/APPS/QMGProzReviews/node_modules/promise/lib/core.js:200:13)
               at new Promise (/Users/TuzMacbookPro2017/Development/QMG-local/APPS/QMGProzReviews/node_modules/promise/lib/core.js:66:3) } ]

  ● searchCustomers › returns an error on a failure

    uh oh!

      41 | 
      42 |   it("returns an error on a failure", async () => {
    > 43 |     const error = new Error("uh oh!");
         |                   ^
      44 |     Array.prototype.filter = jest.fn();
      45 |     Array.prototype.filter.mockImplementation(() => throw error);
      46 |     const dispatched = await recordSaga(searchSaga, initialAction);

СейчасЯ попытался обернуть это в блок try / catch:

it("returns an error on a failure", async () => {
    const error = new Error("uh oh!");
    Array.prototype.filter = jest.fn();
    Array.prototype.filter.mockImplementation(() => throw error);
    try {
      const dispatched = await recordSaga(searchSaga, initialAction);
    } catch (e) {
      console.log(dispatched);
      const expectedAction = { type: "CUSTOMER_SEARCH_FAILURE", error };
      expect(dispatched).toContainEqual(expectedAction);
    }
  });

И это действительно проходит, однако это ложный положительный результат.Если я, например, изменю тип ожидаемого действия на какую-то ерунду, тест все равно пройдет.

Как мне заставить это работать?

Редактировать: я заметил, что console.log(dispatched)никогда не активировался в последнем проходящем примере.Я добавил копию этого оператора журнала в блок try и вижу, что я am получает правильное возвращаемое действие сбоя.

Играя с журналированием, кажется, что ошибка выдается и обнаруживается в некоторых странных местах.

 it("returns an error on a failure", async () => {
    const error = new Error("uh oh!");
    Array.prototype.filter = jest.fn();
    Array.prototype.filter.mockImplementation(() => throw error);
    const expectedAction = { type: "CUSTOMER_SEARCH_FAILURE", error };
    try {
      const dispatched = await recordSaga(searchSaga, initialAction);
      console.log("***DISPATCHED FROM TRY IN TEST***", dispatched);
      expect(dispatched).toContainEqual(expectedAction);
    } catch (e) {
      console.log("***ERROR FROM CATCH IN TEST***", e);
    }
  });

Вышеприведенное записывает в журнал правильные отправленные действия из блока try, а затем регистрирует ошибку "ух-ой" из блока catch.Удаление последней строки блока try записывает правильные действия из блока try, и все, оно проходит.Это проходит, конечно, потому что нет никаких утверждений, чтобы потерпеть неудачу.

Так что, похоже, это фактическое утверждение, которое выдает ошибку.Я не могу понять, когда выдается ошибка и как ее избежать.

1 Ответ

0 голосов
/ 11 июня 2019

Как насчет встраивания ошибки:

it("returns an error on a failure", async () => {
    Array.prototype.filter = jest.fn();
    Array.prototype.filter.mockImplementation(() => throw Error("uh oh!"));
    const dispatched = await recordSaga(searchSaga, initialAction);
    const expectedAction = { type: "CUSTOMER_SEARCH_FAILURE", error };
    console.log(dispatched);
    expect(dispatched).toContainEqual(expectedAction);
  });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...