#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