首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Redux对象的DeepFreeze测试突变

使用Redux对象的DeepFreeze测试突变
EN

Stack Overflow用户
提问于 2017-04-25 04:12:19
回答 1查看 1.6K关注 0票数 1

我有一个简单的Reducer

代码语言:javascript
复制
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

我的规范文件是

代码语言:javascript
复制
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时,我希望它会返回一个非变异数组,因为我在Reducer中使用了ES6 spread语句。

当我调用state = bots(state, payloadThatMutates);时,我期待着一个由deepFreeze标记的错误。这是因为在减速器中,我使用的是state.push(action.bots);,我知道它会发生变异。

但是我没有得到任何错误,并且我的结果状态是一个由3个对象组成的数组。

我有一个错误的减速器,或者我不理解deepFreeze?

这个单元测试并没有像我期望的那样工作。但是,如果我调用'ADD_BOT_THAT_MUTATES操作和Reducer,我没有得到更新的状态,即Redux改变了状态,那么我的应用程序/网络代码就可以工作。

还是我刚刚做了什么愚蠢的事?

EN

回答 1

Stack Overflow用户

发布于 2017-04-25 05:29:41

自从发帖以来,我已经设法理解了deepFreeze,下面是我的两个测试,它们给出了预期的结果

代码语言:javascript
复制
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);
    });

});

希望这对任何人都有帮助

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43596935

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档