2017-04-24 65 views
0

我有一個簡單的減速與速凍的終極版測試突變對象

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 

而且我的規格文件

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

當我打電話減速機採用state = bots(state, payload);我希望它返回一個非突變陣因爲我在Reducer中使用了ES6擴展語句。

當我打電話給state = bots(state, payloadThatMutates);時,我期待着deepFreeze標記的錯誤。這是因爲在Reducers中我使用的是state.push(action.bots);,我知道它會發生變異。

但我沒有得到任何錯誤,我的結果狀態是一個由3個對象組成的數組。

我有一個不正確的減速器,或者我沒有理解deepFreeze?

這個單元測試沒有按我期望的那樣工作。但是,如果我調用'ADD_BOT_THAT_MUTATES操作並且Reducer沒有更新狀態,即我的App/Web代碼有效,即Redux會改變狀態。

或者我只是做了一些簡單的愚蠢?

回答

0

發佈以來,我已經成功地讓我的頭周圍速凍和突變 下面是我的兩個測試,產生預期的結果

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

}); 

希望這有助於任何人