2017-04-24 2 views
0

ich eine einfache Reducer habenTesten Mutationen mit Deepfreeze für Redux Objekte

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 

Und meine Spec-Datei ist

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); 
    }); 
}); 

Wenn ich die Reducer nennen mit state = bots(state, payload); ich erwarten, dass es ein nicht mutiertes Array zurück wie ich eine ES6 Spread-Anweisung im Reducer verwende.

Als ich state = bots(state, payloadThatMutates); nenne ich erwartete einen durch Tiefkühltruhe gekennzeichnet Fehler. Dies liegt daran, dass ich in den Reducers state.push(action.bots); benutze, von denen ich verstehe, dass sie mutieren.

Aber ich bekomme keine Fehler und mein resultierenden Zustand ist ein Array von 3 Objekten.

Habe ich eine falsche Reduzierungen haben oder habe ich nicht verstanden Tiefkühltruhe?

Dieser Unit-Test nicht funktioniert, wie ich erwartet. Aber mein App/Web-Code funktioniert, wenn ich die 'ADD_BOT_THAT_MUTATES'-Aktion und den Reducer anrufe, bekomme ich keinen aktualisierten Zustand, d. H. Redux mutiert den Zustand.

Oder habe ich etwas nur dumm nur getan?

Antwort

0

Seit Posting, ich habe es geschafft, meinen Kopf um Tiefkühltruhe und Mutationen Hier sind meine zwei Tests zu erhalten, dass die erwarteten Ergebnisse

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; 

    beforeEach(() => {   
    state = [] 
     state = bots(state, addBot("initial")); 
    }); 

    it('should pass due to non-muting reducer ',() => { 
     //create a payload 
     let payload = addBot("test 1234"); 
     let state2 = bots(state, payload); 
     //state has non mutated and state2 is a new array 
     expect(state.length).toEqual(1); 
     expect(state2.length).toEqual(2); 
    }); 

    it('should fail due to deepFreeze',() => { 
      deepFreeze(state); 
      //create a payload 
      let payloadThatMutates = addBotThatMutates("test 5678"); 
      //deepFreeze will throw 'object is not extensible' because state is now mutating because of the push in the the reducer 
      let state2 = bots(state, payloadThatMutates);   
      expect(state).toEqual(state2); 
    }); 

}); 

Hoffnung geben hilft dieses jemand

Verwandte Themen