Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/461.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 不确定如何为条件呈现的ReactJS组件编写测试用例_Javascript_Reactjs_Jestjs_Enzyme - Fatal编程技术网

Javascript 不确定如何为条件呈现的ReactJS组件编写测试用例

Javascript 不确定如何为条件呈现的ReactJS组件编写测试用例,javascript,reactjs,jestjs,enzyme,Javascript,Reactjs,Jestjs,Enzyme,我的应用程序最初在组件中使用加载占位符进行渲染,5秒钟后渲染不同的元素。我想用jest和酶来测试这个成分 我的问题是,当我测试它和console.log(wrapper.debug())时,它只显示加载部分 现在我的问题是如何对条件部分进行单元测试 我的App.js import React,{useState, useEffect} from 'react'; import logo from './logo.svg'; import './App.css'; const App = ()

我的应用程序最初在组件中使用加载占位符进行渲染,5秒钟后渲染不同的元素。我想用jest和酶来测试这个成分

我的问题是,当我测试它和console.log(wrapper.debug())时,它只显示加载部分

现在我的问题是如何对条件部分进行单元测试

我的App.js

import React,{useState, useEffect} from 'react';
import logo from './logo.svg';
import './App.css';

const App = () => {
  const [loading, setLoading] = useState(true);
  useEffect(()=>{
    setTimeout(() => {
      setLoading(false)
    }, 5000);
  },[])
  if(loading){
    return <span>loading....</span>
  }
  return (
    <div className="App">
      <header className="App-header">
        <img src={logo} className="App-logo" alt="logo" />
        <p>
          Edit <code>src/App.js</code> and save to reload.
        </p>
        <a
          className="App-link"
          href="https://reactjs.org"
          target="_blank"
          rel="noopener noreferrer"
        >
          Learn React
        </a>
      </header>
    </div>
  );
}

export default App;
我的App.test.js

import React from "react";
import App from "./App";
import { shallow } from "enzyme";

describe("app component", () => {
  it("loading state", () => {
    const setState = jest.fn();
    const useStateMock = (initState) => [initState, setState];
    jest.spyOn(React, "useState").mockImplementation(useStateMock);
    jest.spyOn(React, "useEffect").mockImplementation(setState);
    const wrapper = shallow(<App />);
    const result = wrapper.find("#abc");
    result.simulate("click");
    wrapper.update();
    console.log(wrapper.debug());
    expect(setState).toHaveBeenCalledWith(false);
  });
});
从“React”导入React;
从“/App”导入应用程序;
从“酶”中导入{shall};
描述(“应用程序组件”,()=>{
它(“加载状态”,()=>{
const setState=jest.fn();
const useStateMock=(initState)=>[initState,setState];
jest.spyOn(React,“useState”).mock实现(useStateMock);
jest.spyOn(React,“useffect”).mock实现(setState);
常量包装器=浅();
const result=wrapper.find(#abc”);
结果。模拟(“点击”);
wrapper.update();
log(wrapper.debug());
期望(设置状态)。已被调用(false);
});
});

您可以尝试使用:
jest.setTimeout(6000)

从“React”导入React;
从“/App”导入应用程序;
从“酶”中导入{shall};
描述(“应用程序组件”,()=>{
它(“加载状态”,()=>{
const setState=jest.fn();
const useStateMock=(initState)=>[initState,setState];
jest.spyOn(React,“useState”).mock实现(useStateMock);
jest.spyOn(React,“useffect”).mock实现(setState);
常量包装器=浅();
const result=wrapper.find(#abc”);
结果。模拟(“点击”);
wrapper.update();
jest.setTimeout(6000)
log(wrapper.debug());
期望(设置状态)。已被调用(false);
})

老实说,我不会在您的组件中放置计时器来显示加载文本。相反,您通常会有一个全局机制来检查页面或api调用是否已完成,并将该标志存储在数据存储中。如果您必须按自己的方式来做,(这并不理想)然后我将提取作为一个单独的组件,并自行测试。您没有正确的组件代码来模拟react钩子,但是您的
useState
mock也不会更新它返回给被测组件的值,因此可以执行单独的条件。您考虑过react测试库吗?它是一个测试UI比测试酶容易(IMHO)。
import React from "react";
import App from "./App";
import { shallow } from "enzyme";

describe("app component", () => {
  it("loading state", () => {
    const setState = jest.fn();
    const useStateMock = (initState) => [initState, setState];
    jest.spyOn(React, "useState").mockImplementation(useStateMock);
    jest.spyOn(React, "useEffect").mockImplementation(setState);
    const wrapper = shallow(<App />);
    const result = wrapper.find("#abc");
    result.simulate("click");
    wrapper.update();
    jest.setTimeout(6000)
    console.log(wrapper.debug());
    expect(setState).toHaveBeenCalledWith(false);
  })