- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试测试一个 state
值(例如:state.name
),它会在单击按钮时异步更改。
最初
state.name
是“随机值”
state.name
从“Random”变为“peter”
值”
button.simulate('click')
上发挥同样的作用
App.js
:import React, { Component } from 'react';
class App extends Component {
state = {name: "Random Value"};
render() {
return (
<div className="App">
<div>{this.state.name}</div>
<button onClick={this.handleClick}>GetData</button>
</div>
);
}
handleClick = () => {
const currentContext = this;
fetch('http://api-call/getdata')
.then(function(response) {
return response.json();
})
.then(function(jsonData) {
// jsonData.name = "peter"
currentContext.setState({name: jsonData.name});
})
}
}
export default App;
App.test.js
describe('<App/>', () => {
it('should handle click correctly', () => {
const wrapper = shallow(<App />);
expect(wrapper.find('button').length).toBe(1);
expect(wrapper.state().name).toEqual("Random Value");
wrapper.find('button').simulate('click');
expect(wrapper.update().state().name).toEqual("peter");
});
});
// FAILED!
Expected value to equal:
"peter"
Received:
"Random Value"
各种各样的解决方案,比如使用 async await
、setImmediate
然后是 wrapper.update()
和许多其他东西。也许我做错了什么或错过了什么。无论如何,我已经花了一个晚上试图做到这一点。我需要 enzyme
专家的帮助。
谢谢
最佳答案
首先你需要以某种方式模拟fetch
。发送真实请求不仅打破了单元测试的隔离,还增加了不一致的风险。当您不知道什么时候可以完成时,等待响应也更难。有不同的方法可以实现这一目标。 jest-fetch-mock
就是其中之一。
此外,我建议您不要检查 state
,而是检查 render()
结果。
function getName(wrapper) {
return wrapper.find('.App > div').at(0).props().children;
}
it('should handle click correctly', async () => {
fetch.mockResponseOnce(JSON.stringify({ name: '12345' }));
const wrapper = shallow(<App />);
expect(wrapper.find('button').length).toBe(1);
expect(getName(wrapper)).toEqual("Random Value");
wrapper.find('button').simulate('click');
await Promise.resolve();
expect(getName(wrapper)).toEqual("peter");
});
这是怎么回事。 await Promise.resolve()
只是等待所有已解决的 promise 运行。这意味着如果没有我们的模拟响应将不会在按钮单击和 expect
运行之间运行。
另一种获得积极结果的方法是让 handleClick()
返回我们可以等待的 Promise:
...
handleClick = () => {
const currentContext = this;
return fetch('http://api-call/getdata')
.then(function(response) {
return response.json();
})
.then(function(jsonData) {
// jsonData.name = "peter"
currentContext.setState({name: jsonData.name});
})
}
....
it('should handle click correctly', async () => {
....
expect(getName(wrapper)).toEqual("Random Value");
await wrapper.find('button').simulate('click');
expect(getName(wrapper)).toEqual("peter");
});
或不使用异步等待语法:
it('should handle click correctly', () => {
....
expect(getName(wrapper)).toEqual("Random Value");
return wrapper.find('button').simulate('click').then(() => {
expect(getName(wrapper)).toEqual("peter");
});
});
但我真的不喜欢这种方式,因为事件处理程序必须返回它通常不会返回的 Promise。
更多关于微任务(Promises)/宏任务(计时器,事件)的信息你可以在这里阅读:https://abc.danch.me/microtasks-macrotasks-more-on-the-event-loop-881557d7af6f
更多关于在 Jest 中测试异步代码的信息,您最好查看他们的文档:https://jestjs.io/docs/en/asynchronous
关于javascript - enzyme :在模拟 "click"时,测试异步更改的状态值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55068319/
我有一个帮助程序类,它提供有关登录用户的信息。我想将它作为静态方法并在多个地方使用它(不是 react 组件) 如何访问类模型中的 redux 存储值? 最佳答案 如果您可以在应用程序中管理它,那么使
我正在构建一个简单的 rgba 选择器,它允许用户通过向上箭头和向下箭头键切换各个值。下面是我的代码片段。 class App extends Component { constructor(){
想象一下这段代码: class App extends React.Component { state = { name: "george", counter: 1 };
我正在使用 PHP SDK getLoginUrl() 函数,它可以完美地让用户登录。一旦用户被重定向回我的页面,URL 可以有两种形式,请参见以下链接第 3 小节:http://developers
我正在尝试对我的 ReactJS 组件进行单元测试。基本上它是一个由输入和按钮组成的简单组件。单击按钮时,它会触发一个名为“onSave”的事件,并且仅当 state.textValue 不为空时才会
我试图通过将成员变量保存在 ViewState 中(只有几个小变量)来保留它们,但是我读了一下,我发现在 PreRender 阶段将它们保存到 ViewState 中比 PageLoad 更好? 我可
我正在尝试根据用户的输入更改 div 背景颜色。我想将状态键设置为色调,值为用户输入。然后我想获取该状态并将其注入(inject)另一个名为颜色值的状态键。我希望颜色值是在 chromajs 中使用
研究应该是对数据库的简单调用。选择与当前用户对应的记录,然后根据检索到的数据执行一些代码。但是,当它尝试查询数据库时,它返回“数据转换失败。[ OLE DB 状态值(如果已知)= 2 ]”。有什么想法
我正在运行以下代码 /*Fetchinch Last CustID from custMaster*/ int ID = 0; try { con.Open(); da = new
我是一名优秀的程序员,十分优秀!