程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何测试 useState 是否已被调用或按钮是否已被单击?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决如何测试 useState 是否已被调用或按钮是否已被单击??

开发过程中遇到如何测试 useState 是否已被调用或按钮是否已被单击?的问题如何解决?下面主要结合日常开发的经验,给出你关于如何测试 useState 是否已被调用或按钮是否已被单击?的解决方法建议,希望对你解决如何测试 useState 是否已被调用或按钮是否已被单击?有所启发或帮助;

我一直试图找到一种方法来在一个简单的 tsx 文件上获得 100% 的覆盖率,而开玩笑告诉我需要覆盖率的仅有两行是我传递执行 {{1} } 来自setState

我读过我不应该测试钩子,因为用户只关心 UI。这就是为什么我的问题是如何测试这两行。

useState

function App(): JsX.Element { const [step,setStep] = React.useState(0); return ( <main classname={style.app}> <GrID classname={style.header} centeralign> <button ID="home-button" classname={style.headerHomeBtn} onClick={() => setStep(0)} > <img classname={style.headerHome} src={home} alt="home button" /> </button> <h1>Financial Advisor</h1> </GrID> {step === 0 && <RiskSelector continue={() => setStep(1)} />} {step === 1 && <Portfolio />} </main> ); }

哪些是 Uncovered line #s: 18-24onClick 道具。到目前为止,我的测试是:

continue

控制台输出只是告诉我按钮在那里。

测试未通过,因为从未调用 describe('Dummy',() => { let wrapper: any; const setState = jest.fn(); const useStateMock: any = (initState: any) => [initState,setState]; beforeEach(() => { wrapper = shallow(<Dummy />); }); afterEach(() => { jest.clearallMocks(); }); describe('Home button clicked',() => { it('calls setStep with 0',() => { jest.spyOn(React,'useState').mockImplementation(useStateMock); console.log(wrapper.deBUG()); wrapper.find('button').props().onClick(); expect(setState).toHaveBeenCalled(); }); }); });

解决方法

您不应该模拟 React.useState() 钩子,并测试事件处理程序的实现细节。您应该测试组件的行为。行为是,例如,当状态改变时,视图会发生什么。

例如

App.tsx

import { Grid } from './Grid';
import React from 'react';
import { RiskSelector } from './RiskSelector';
import { Portfolio } from './Portfolio';

const home = 'http://localhost:3000/home.png';

export function App(): JSX.Element {
  const [step,setStep] = React.useState(0);
  return (
    <main>
      <Grid centerAlign>
        <button id="home-button" onClick={() => setStep(0)}>
          <img src={home} alt="home button" />
        </button>
        <h1>Financial Advisor</h1>
      </Grid>
      {step === 0 && <RiskSelector continue={() => setStep(1)} />}
      {step === 1 && <Portfolio />}
    </main>
  );
}

Grid.tsx

import React from 'react';

export function Grid({ children,centerAlign }) {
  return <div>{children}</div>;
}

Portfolio.tsx

import React from 'react';
export function Portfolio() {
  return <div>Portfolio</div>;
}

RiskSelector.tsx

import React from 'react';

export function RiskSelector({ continue: onContinue }) {
  return <div onClick={onContinue}></div>;
}

App.test.tsx

import React from 'react';
import { App } from './App';
import { shallow } from 'enzyme';
import { Portfolio } from './Portfolio';
import { RiskSelector } from './RiskSelector';

describe('67412919',() => {
  let wrapper: any;

  beforeEach(() => {
    wrapper = shallow(<App />);
  });
  afterEach(() => {
    jest.clearAllMocks();
  });

  describe('Home button clicked',() => {
    it('calls setStep with 0',() => {
      wrapper.find('button').simulate('click');
      expect(wrapper.find(RiskSelector)).toHaveLength(1);
    });

    it('calls setStep with 1',() => {
      wrapper.find(RiskSelector).invoke('continue')();
      expect(wrapper.find(Portfolio)).toHaveLength(1);
      expect(wrapper.find(RiskSelector)).toHaveLength(0);
    });
  });
});

100% 覆盖 App.tsx 文件的单元测试结果。

 PASS  examples/67412919/App.test.tsx (7.433 s)
  67412919
    Home button clicked
      ✓ calls setStep with 0 (24 ms)
      ✓ calls setStep with 1 (12 ms)

------------------|---------|----------|---------|---------|-------------------
File              | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
------------------|---------|----------|---------|---------|-------------------
All files         |   84.21 |      100 |      50 |   84.21 |                   
 App.tsx          |     100 |      100 |     100 |     100 |                   
 Grid.tsx         |   66.67 |      100 |       0 |   66.67 | 4                 
 Portfolio.tsx    |   66.67 |      100 |       0 |   66.67 | 3                 
 RiskSelector.tsx |   66.67 |      100 |       0 |   66.67 | 4                 
------------------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed,1 total
Tests:       2 passed,2 total
Snapshots:   0 total
Time:        7.958 s,estimated 8 s
,

不仅仅是用户只关心 UI,功能组件的测试也只关心 UI :)。换句话说,测试不断变化的渲染内容,而不是函数的实现。

因此,模拟该按钮点击并测试是否呈现 RiskSelectorPortfolio

大佬总结

以上是大佬教程为你收集整理的如何测试 useState 是否已被调用或按钮是否已被单击?全部内容,希望文章能够帮你解决如何测试 useState 是否已被调用或按钮是否已被单击?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: