javascript - ReactJs 点击后状态不更新
问题描述
我使用 Enzyme 和 Jest 测试我的 React 应用程序。这是我的组件:
function App() {
const [state, setState] = React.useState('default');
const [loading, setLoading] = React.useState(false);
const [name, setName] = React.useState('ji');
return (
<div className="App">
<h2>{state}</h2>
<h1 className='test'>Helljo</h1>
<h1 className='test'>Hello</h1>
<button onClick={() => {
setState('changed');
setLoading(true)
}}>Click</button>
<Child setName={setName} name={name}/>
</div>
);
}
export default App;
单击按钮我更新h2
标签中的文本。
下面是我的测试,应该测试这个事件:
import { configure, shallow, mount, render } from 'enzyme';
import App from './App';
import React, {useState} from "react";
describe('Test main component', () => {
let wrapper = shallow(<App />);
let setState;
let setName;
let setLoading;
beforeEach(() => {
setState = jest.fn(x => {});
setName = jest.fn(x => {});
setLoading = jest.fn(x => {});
React.useState = jest.fn()
.mockImplementationOnce(state => [state, setState])
.mockImplementationOnce(loading => [loading, setLoading])
.mockImplementationOnce(name => [name, setName])
});
afterEach(() => {
jest.clearAllMocks();
});
test('should change state on text', () => {
const btn = wrapper.find("button");
btn.simulate("click");
expect(wrapper.find('h2').text()).toBe('changed');
})
})
运行这个测试我得到:
Expected: "changed"
Received: "default"
为什么我会得到这个以及如何使测试可行?注意:如果我删除该beforeEach
语句,代码将按预期工作,但我需要保留该逻辑,因为我需要测试组件的状态。
问题:为什么我的代码没有检索到预期的结果以及如何解决?
解决方案
因为你模拟setState
一个函数不做任何事情所以state
不会更新。
setState = jest.fn(x => {});
你不能嘲笑setState
。因为它涉及到更改state
和重新渲染component
. 所以你应该保留setState
, 专注于另一个逻辑。
推荐阅读
- javascript - Netsuite 脚本 2.0
- java - Java AudioInputStream如何支持负字节数的跳过
- firebase - 验证 Firestore 安全规则中的引用
- java - 如何在 jar 文件中插入和更新 sqlite 数据库
- python - 使用 Open CVadaptiveThreshold() 方法时如何知道阈值?
- java - 通过使用注释在休眠中的未知实体异常
- javascript - 元素注入后刷新DOM
- javascript - 从类中提取元素时如何使用JS更改元素的CSS属性?
- javascript - 如何使某些代码点表情符号值起作用
- meteor - Meteor/Apollo:为生产设置 Redis Pubsub?