首页 男生 其他 深入浅出React和Redux

8.3.5 被连接的React组件测试

深入浅出React和Redux 程墨 2220 2021-04-06 02:29

  您可以在百度里搜索“深入浅出React和Redux 艾草文学(www.321553.xyz)”查找最新章节!

  

  8.3.5 被连接的React组件测试

  如果将应用状态存放在Redux Store上,配合使用react-redux库,所有有状态的React组件都是通过connect函数产生的组件,被称为“被连接的组件”。

  以第5章的todo_with_selector/src/todos/views/todoList.js为例,这是一个被链接的组件,在todo_with_selector/test/todos/views/todoList.test.js文件中可以看到全部单元测试代码。

  TodoList这样一个组件依赖于一个Redux Store实例,而且能够实实在在地提供内容,所以不再使用redux-mock-store,而是使用一个货真价实的Redux Store,需要创造一个store,代码如下:

  const store = createStore(

  combineReducers({

  todos: todosReducer,

  filter: filterReducer

  }), {

  todos: [],

  filter: FilterTypes.ALL

  });

  为了将这个Store放在React Context,还需要创造Provider,使用Enzyme的mount方法渲染的是Provider包裹起来的TodoList组件,代码如下:

  const subject = (

  

  );

  const wrapper = mount(subject);

  最终,通过调用store.dispatch函数派发action,然后就可以验证wrapper对象上的渲染元素是否发生了预期改变:

  store.dispatch(actions.addTodo('write more test'));

  expect(wrapper.find('.text').text()).toEqual('write more test');

  这个单元测试中,我们想要模拟一次完整的action对象处理周期,派发出一个add-Todoaction对象之后,应该在DOM树中存在对应的待办事项文字,待办事项文字存在于TodoItem组件中。为了检查DOM中的文字,就需要用mount函数而不是shallow函数。

  上面创造Provider的过程看起来有一点麻烦,主要是因为TodoList组件还包含了TodoItem组件也是连接到Store的组件,如果被测试组件并不包含任何其他链接到Store的子组件,那就可以直接在组件渲染中用名为store的prop。

  例如,对于TodoItem组件的单元测试,就可以在JSX中直接这样写,不用Provider:

  const subject = ;

  const wrapper = mount(subject); 深入浅出React和Redux

目录
设置
手机
书架
书页
评论