首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Immer测试redux reducers

使用Immer测试redux reducers
EN

Stack Overflow用户
提问于 2019-04-03 18:31:13
回答 1查看 1.2K关注 0票数 0

我最近开始在react应用程序的redux reducers中使用Immer,因为我在它们中有很多嵌套的状态。(让我们避免这样的事实,这些嵌套可以用子缩减来解决)。

Immer的用法对我来说很清楚,但是一旦我开始用jest编写单元测试,我就开始想,我应该避免在测试中使用Immer吗?

让我们有一个基本的reducer示例:

代码语言:javascript
复制
export default function (state = initialState, action) {
    return produce(state, (draftState) => {
        switch (action.type) {
            case MY_TYPE:
                draftState.some.nested.flag = true;
                break;
        }
    });
}

然后我的测试也使用了Immer

代码语言:javascript
复制
it('should handle MY_TYPE', () => {
    const storeState = reducer(initialState, {
        type: MY_TYPE
    });
    const newState = produce(initialState, (draftState) => {
        draftState.some.nested.flag = true;
    });
    expect(storeState).toEqual(newState);
});

所以我的问题是,我是否应该避免在测试中使用Immer produce,而是使用扩展语法手动创建嵌套对象的副本?类似于:

代码语言:javascript
复制
.toEqual({
    ...initialState,
    some: {
        ...initialState.some,
        nested: {
            ...initialState.some.nested,
            flag: true
        }
    }
})

那么在测试中使用Immer有什么缺陷吗?

EN

回答 1

Stack Overflow用户

发布于 2019-04-03 19:28:09

在这种情况下,Immer不会更改所有状态。例如:

代码语言:javascript
复制
const state = {
  some: {
    another: {},
    nested: {
      flag: true
    }
  }
};

const nextState1 = produce(state, draft => {
  draft.some.nested.flag = false;
});

const nextState2 = produce(state, draft => {
  draft.some.nested.flag = false;
});

expect(nextState1).toEqual(nextState2);

expect(nextState1.another).toBe(nextState2.another); // true!
expect(nextState1).toBe(nextState2); // false
expect(nextState1.some).toBe(nextState2.some); // false
expect(nextState1.some.nested).toBe(nextState2.some.nested); // false

其中"toBe“是一个检查对象实例身份的函数(与”toEqual“不同)。我认为,您不应该避免在单元测试中使用Immer。它可能需要另一个断言函数来检查是否只更改了树的一部分。

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

https://stackoverflow.com/questions/55492980

复制
相关文章

相似问题

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