принять утверждение с помощью redux-saga-test-plan, которое принимает функцию в качестве шаблона, выдает ошибку ‘take effects do not match’

#javascript #unit-testing #redux #redux-saga #redux-saga-test-plan

#javascript #модульное тестирование #redux #redux-saga #redux-saga-test-plan

Вопрос:

Я хочу протестировать сагу, которая дает take эффект, который принимает функцию в качестве шаблона, например

 export function* mySaga(myAction: {
  type: string;
}): Generator<TakeEffect, boolean, { type: string }> {
  const { type: actionType } = (yield take(
    (action: any) => action.type === myAction.type,
  )) as { type: string };
  return actionType === myAction.type;
}
  

с помощью теста, который выглядит как:

 it('Should test mySaga', () => {
  testSaga(mySaga, { type: 'myActionType' }).next().take().next().finish();
});
  

но я получаю следующую ошибку:

 SagaTestError: 
Assertion 1 failed: take effects do not match

Expected
--------
{ '@@redux-saga/IO': true,
  combinator: false,
  type: 'TAKE',
  payload: { pattern: '*' } }

Actual
------
{ '@@redux-saga/IO': true,
  combinator: false,
  type: 'TAKE',
  payload: { pattern: [Function] } }
  

Мне не удалось найти, как утвердить вступающий в силу эффект, который принимает шаблон функции вместо строки. Кто-нибудь, пожалуйста, может мне помочь?

Ответ №1:

Поскольку вы передаете анонимную функцию take создателю эффекта. Мы не можем получить эту анонимную функцию в тестовом примере, используя модуль requireing.

Вы можете использовать помощник для проверки общих утверждений.

Если ваша saga выдает значение недетерминированного типа или что-то, что нелегко охватить утверждениями effect или другими общими утверждениями, то вы можете использовать inspect для извлечения фактического полученного значения и выполнения собственных утверждений с помощью вашей любимой библиотеки утверждений.

Чтобы мы могли получить возвращаемый эффект yield take((action: any) => action.type === myAction.type) . Затем подтвердите этот эффект.

Например. (используя jestjs в качестве платформы тестирования)

saga.ts :

 import { TakeEffect, take } from 'redux-saga/effects';

export function* mySaga(myAction: { type: string }): Generator<TakeEffect, boolean, { type: string }> {
  const { type: actionType } = (yield take((action: any) => action.type === myAction.type)) as { type: string };
  console.log('actionType: ', actionType);
  return actionType === myAction.type;
}
  

saga.test.ts :

 import { testSaga } from 'redux-saga-test-plan';
import { TakeEffect } from 'redux-saga/effects';
import { mySaga } from './saga';

describe('63523200', () => {
  it('should pass', () => {
    testSaga(mySaga, { type: 'myActionType' })
      .next()
      .inspect<TakeEffect>((yieldedValue) => {
        expect(yieldedValue.payload.pattern).toEqual(expect.any(Function));
        // test this anonymous function
        expect((yieldedValue.payload.pattern as Function)({ type: 'myActionType' })).toBeTruthy();
        expect((yieldedValue.payload.pattern as Function)({ type: 'hisActionType' })).toBeFalsy();
      })
      .next({ type: 'otherActionType' })
      .isDone();
  });
});
  

результат модульного теста:

  PASS  src/stackoverflow/63523200/saga.test.ts
  63523200
    ✓ should pass (23 ms)

  console.log
    actionType:  otherActionType

      at src/stackoverflow/63523200/saga.ts:5:11

----------|---------|----------|---------|---------|-------------------
File      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
----------|---------|----------|---------|---------|-------------------
All files |     100 |      100 |     100 |     100 |                   
 saga.ts  |     100 |      100 |     100 |     100 |                   
----------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        2.809 s, estimated 3 s