使用umi useModel 简易数据流进行单元测试的简单方法

文章讲述了在遇到不能直接测试React组件,特别是使用了useModel和UniContext的情况时,由于缺少对应的Provider导致的错误。作者提出了一种简单的实现方案,即在测试时创建一个TestModel组件,模拟Provider来提供context,包括initialState的数据。这样可以使得测试能够正常进行。示例代码展示了TestModel组件的实现和在Jest测试中的使用方法。
摘要由CSDN通过智能技术生成

不能直接测试的原因

Cannot read properties of undefined (reading '@@initialState')
报错 Cannot read properties of undefined (reading ‘@@initialState’)
看源码
源码
useModel在内部是使用了useContext(),测试组件时在上层并没有对应的Provider,所以读取不到UniContext,更拿不到@@initialState

实现方案

在测试该组件时定义应该父组件UniContext.Provider,在这里提前指定好context。
这里简单封装一下,因为是简单实现所以没写更多的功能

import { UmiContext } from '@/.umi/plugin-model/helpers/constant';
import React from 'react';

interface ITestModelProps {
  data: Record<string, any>;
}

const TestModel: React.FunctionComponent<ITestModelProps> = (props) => {
  const callbackSet = new Set([() => {}]);
  const callbacks: Record<string, Set<() => void>> = {};
  Object.keys(props.data).forEach((item) => {
    callbacks[item] = callbackSet;
  });
  const update = (namespace: string) => {
    callbacks[namespace].forEach((callback: (val: any) => void) => {
      callback(props.data);
    });
  };
  return (
    <UmiContext.Provider
      value={{
        data: props.data,
        callbacks,
        update,
      }}
    >
      {props.children}
    </UmiContext.Provider>
  );
};

export default TestModel;

使用方式

test('test Home page', async () => {
	//...省略mock获取数据
	const ins = render(
      <TestModel
        data={{
          '@@initialState': { initialState: { currentUserInfo, settings: defaultSettings } },
        }}
      >
        <Home />
      </TestModel>,
    );
	//...省略测试内容
}

相关GitHub Issues 链接

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
umi 是一个基于 React 的企业级前端应用开发框架,可以帮助开发者快速构建高质量的单页应用或多页应用。使用 umi 时,可以通过 useModel使用 umi 中的模型。 useModelumi 中用于访问和管理模型的 Hook,可以在函数组件中使用。在使用 useModel 之前,需要先在 model 文件夹中定义模型。 具体使用方法如下: 1. 在函数组件中引入 useModel ``` import { useModel } from 'umi'; ``` 2. 使用 useModel 获取模型对象 ``` const model = useModel('modelName'); ``` 其中,modelName 是在 model 文件夹中定义的模型名称。 3. 在组件中使用模型 ``` function MyComponent() { const model = useModel('modelName'); const { data, error, loading } = model.someEffect(); // ... } ``` 在组件中,可以通过模型对象调用模型中的方法,例如一些异步操作。 注意:在使用 useModel 之前,需要先在 config/config.ts 文件中配置 model 属性,指定 model 文件夹的路径。 ``` export default { // ... // 配置 model 文件夹的路径 // 即 model 文件夹所在的目录 // 默认为 src/models // 如果在根目录下创建了 models 目录,则需要手动指定路径为 ./models // 如果没有使用 model,则可以省略该属性 // 例如:model: {}, model: { // 指定 model 文件夹的路径 // 如果 models 目录在根目录下,则为 './models' // 如果 models 目录在 src 目录下,则为 './src/models' // 如果没有使用 model,则可以省略该属性 // 例如:'./models', dir: 'model', }, // ... }; ``` 以上就是使用 umi 中的 useModel Hook 的基本方法,希望能帮助到你。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值