Тест редукторов с Immer - PullRequest
0 голосов
/ 03 апреля 2019

Я недавно начал использовать Immer в редукторных редукторах в своем приложении реакции, так как в них много вложенных состояний. (давайте избегать того факта, что эти вложения могут быть решены с помощью вспомогательных редукторов).

Использование Immer для меня очевидно, но как только я начал писать юнит-тесты с шуткой, я начал задаваться вопросом, следует ли мне избегать использования Immer в тестах?

Давайте рассмотрим базовый пример редуктора:

export default function (state = initialState, action) {
    return produce(state, (draftState) => {
        switch (action.type) {
            case MY_TYPE:
                draftState.some.nested.flag = true;
                break;
        }
    });
}

тогда мой тест, который также использует Immer

it('should handle MY_TYPE', () => {
    const storeState = reducer(initialState, {
        type: MY_TYPE
    });
    const newState = produce(initialState, (draftState) => {
        draftState.some.nested.flag = true;
    });
    expect(storeState).toEqual(newState);
});

Таким образом, мой вопрос заключается в том, чтобы я не использовал Immer производить в тестах и ​​делать копию вложенного объекта вручную с использованием синтаксиса распространения? Что-то вроде:

.toEqual({
    ...initialState,
    some: {
        ...initialState.some,
        nested: {
            ...initialState.some.nested,
            flag: true
        }
    }
})

Так есть ли какие-нибудь подводные камни при использовании Immer в тестах?

1 Ответ

0 голосов
/ 03 апреля 2019

В этом случае Immer не меняет все состояние.Например:

const state = {
  some: {
    another: {},
    nested: {
      flag: true
    }
  }
};

const nextState1 = produce(state, draft => {
  draft.some.nested.flag = false;
});

const nextState2 = produce(state, draft => {
  draft.some.nested.flag = false;
});

expect(nextState1).toEqual(nextState2);

expect(nextState1.another).toBe(nextState2.another); // true!
expect(nextState1).toBe(nextState2); // false
expect(nextState1.some).toBe(nextState2.some); // false
expect(nextState1.some.nested).toBe(nextState2.some.nested); // false

Где «toBe» - это функция, которая проверяет идентичность экземпляров объекта (в отличие от «toEqual»).Я думаю, вам не следует избегать использования Immer в модульных тестахВероятно, для этого требуется другая функция assert, которая проверяет, что изменена только часть дерева.

...