J'ai simple Réducteurmutations d'essai avec DeepFreeze pour Redux objets
const uid =() => Math.random().toString(34).slice(2);
const bots = (state = [] , action) => {
switch(action.type) {
case 'ADD_BOT':
return [
...state, {
id: uid(),
isDone: false,
text: action.bots.text
}
]
//this will fail
case 'ADD_BOT_THAT_MUTATES':
console.log("mutating");
action.bots.id = uid();
state.push(action.bots);
return state;
default:
return state;
}
}
export default bots
Et mon fichier de spécification est
import deepFreeze from 'deep-freeze';
import bots from '../bots';
describe('Simple test',() => {
function addBot(text) {
return {
type: 'ADD_BOT',
bots: {
id: 1,
isDone: false,
text: text
}
};
}
function addBotThatMutates(text) {
return {
type: 'ADD_BOT_THAT_MUTATES',
bots: {
id: 1,
isDone: false,
text: text
}
};
}
let state = [];
deepFreeze(state);
beforeEach(() => {
state = bots(state, addBot("initial"));
});
it('should fail due to deepFreeze',() => {
//create a payload
let payload = addBot("test 1234");
let payloadThatMutates = addBotThatMutates("test 5678");
state = bots(state, payload);
state = bots(state, payloadThatMutates);
expect(3).toEqual(state.length);
});
});
Quand j'appelle le réducteur avec state = bots(state, payload);
j'attendre pour retourner un tableau non mutées car j'utilise une instruction de propagation ES6 dans le réducteur.
Lorsque j'appelais state = bots(state, payloadThatMutates);
Je m'attendais à une erreur signalée par deepFreeze. C'est parce que dans les Reducers j'utilise state.push(action.bots);
qui, je crois, va muter.
Mais je ne reçois aucune erreur et mon état resultant est un tableau de 3 objets.
Est-ce que j'ai un Reducers incorrect ou n'ai-je pas compris deepFreeze?
Ce test d'unité ne fonctionne pas comme prévu. Mais mon code App/Web fonctionne si j'appelle l'action 'ADD_BOT_THAT_MUTATES et que Reducer n'obtient aucun état mis à jour, c'est-à-dire que Redux mute l'état. Ou est-ce que je viens de faire quelque chose de complètement stupide?