Day 15 使用renderHook

来,今天来看renderHooks这个library吧,大家可以看到昨天的写法,透过render component的方式去取得hook的value这种方式太不方便,因此今天介绍这一套

'@testing-library/react-hooks'

那接下来把昨天的code进行改写

import { renderHook, act } from '@testing-library/react-hooks';
import { useChangeName } from '@hooks/useName';

test.only('I want to test useName', () => {
	const { result } = renderHook(useChangeName);
	
	expect(result.current.name).toBe('stan');

	act(() => {
		result.current.setFullName();
	});

	expect(result.current.name).toBe('stanmaomao');
})

那接下来新增如何传parms进去hook,来我们看一下这只API的定义

function renderHook(callback: (prop?: any) => any, options?: RenderHookOptions): RenderHookResult 

在RenderHookOptions的选项,我们可以在这边找到

在这边我们可以用到initialProps,来传props进到hook

const { result } = renderHook(useChangeName, {initialProps: {
	name: 'good'
}})

那这时我们就可以改写一下

import { useState } from 'react';

type NameType = {
	name: string;
}

export const useChangeName = ({ name: initialName }: NameType) => {
  const [name, setName] = useState<string>(initialName);

  const setFullName = () => {
    setName('stanmaomao');
  };

  return { name, setFullName };
};

接下来我们测试就改写成

test.only('useName', () => {
  const { result } = renderHook(useChangeName, {
    initialProps: {
      name: 'good'
    }
  });
  expect(result.current.name).toBe('good');
  act(() => {
    result.current.setFullName();
  });
  expect(result.current.name).toBe('stanmaomao');
});

这样就完成拉!!

明天来学习测试加入Provider


<<:  【Day14】样式 Style

>>:  Day17_控制项(A9存取控制)

中阶魔法 - 闭包 Closure (一)

前情提要 「艾草艾草,你在做什麽?」 艾草:「没特别做什麽呀!」 「艾草艾草,我问你喔!」 艾草:「...

[Day3] - 前端,後端是在做什麽? --续 前端後端的历史及架构

其实每个时期程序流行的架构以及写法会略有不同,每个时期前端後端负责的范畴也不尽相同,我们无法知道我们...

Day13 - this&Object Prototypes Ch3 Objects - Contents - Existence - Enumeration 作者建议

使用 in 搭配 for 时, array 内所有 enumerable 为 true 的 prop...

Day27 - 区块链社会学读後感(下) 价值、治理

继上篇主要以区块链三个特徵叙写,下篇笔者将探讨区块链的价值、治理,这篇会是比较实用一点的生活应用面向...

ISO 27001 资讯安全管理系统 【解析】(二十四)

(二)风险分析 ISO 27005从一开始就强调不是方法论,此标准只是资讯安全风险管理指引,所以方法...