Проблема
В redux-saga
я использую yield delay(1000);
. Во время модульного тестирования я делаю expect(generator.next().value).toEqual(delay(1000));
.
Я ожидаю, что тест пройдет.
Это мой sagas.js
:
import { delay } from 'redux-saga';
export function* incrementAsync() {
yield delay(1000);
}
Это мой sagas.test.js
import { delay } from 'redux-saga';
import { incrementAsync } from '../sagas';
describe('incrementAsync Saga test', () => {
it('should incrementAsync', () => {
const generator = incrementAsync();
expect(generator.next().value).toEqual(delay(1000));
});
});
● incrementAsync Saga test ›должен incrementAsync
expect(received).toEqual(expected)
Expected value to equal:
{"@@redux-saga/CANCEL_PROMISE": [Function anonymous]}
Received:
{"@@redux-saga/CANCEL_PROMISE": [Function anonymous]}
Difference:
Compared values have no visual difference.
Вопрос
Как я могу проверить задержку redux-saga ?
2 ответа
Если вы отметите эффект саги delay
code, вы можете видеть, что это связанная функция:
export const delay = call.bind(null, delayUtil)
Поэтому, если вы импортируете delay
в двух разных модулях, это будут две разные функции, не имеющие визуального различия .
Вы можете проверить это в примере codeandbox (см. Вкладку test):
const testFunction = () => {};
describe("example bound functions equality test", () => {
it("Two bound functions are not equal", () => {
expect(testFunction.bind(this))
.not.toEqual(testFunction.bind(this));
});
});
Чтобы проверить свою сагу, вы должны имитировать свой эффект delay
(если вы используете Jest);
import { delay } from "redux-saga";
import { incrementAsync } from "../sagas";
jest.mock("redux-saga");
describe("incrementAsync Saga test", () => {
it("should incrementAsync", () => {
const generator = incrementAsync();
expect(generator.next().value).toEqual(delay(1000));
});
});
Хороший способ проверить вызовы Redux Saga - использовать эффект call
. В этом случае вы можете немного реорганизовать свою сагу следующим образом:
import { delay } from 'redux-saga';
import { call } from 'redux-saga/effects';
export function* incrementAsync() {
yield call(delay, 1000);
}
Затем вы можете проверить это так:
import { delay } from 'redux-saga';
import { call } from 'redux-saga/effects';
describe('incrementAsync', () => {
it('should incrementAsync()', () => {
const generator = incrementAsync();
expect(generator.next().value).toEqual(call(delay, 1000));
});
});
Это работает, потому что результатом yield to call
является простой объект, описывающий вызов функции delay
. Никаких моков не нужно :)
Также, конечно, есть отличная вспомогательная библиотека redux-saga-test-plan
. Используя это, ваш тест станет следующим:
import { testSaga } from 'redux-saga-test-plan';
import { delay } from 'redux-saga';
import { call } from 'redux-saga/effects';
describe('incrementAsync', () => {
it('should incrementAsync()', () => {
testSaga(incrementAsync)
.next()
.call(delay, 1000)
.next()
.isDone();
});
});
Похожие вопросы
Новые вопросы
reactjs
React - это библиотека JavaScript для создания пользовательских интерфейсов. Он использует декларативную компонентную парадигму и стремится быть одновременно эффективным и гибким.