2017-04-24 67 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); 
    }); 

}); 

希望这有助于任何人