通过ajax调用在componentDidMount中正确设置测试状态
Testing state gets set correctly within componentDidMount from an ajax call
在我的react组件
中有以下代码componentDidMount() {
ajax.call().then((data)=> {
this.setState({a:data.a});
});
}
我正在调用一个返回promise的函数。
我的测试是这样的,当我试图测试状态是否从已解决的承诺中得到正确设置时:
it('should set state of a', (done)=> {
let ajax = {
call: ()=>{}
};
spyOn(ajax, 'call').and.returnValue(Promise.resolve({a:'a'}));
let component = TestUtils.renderIntoDocument(<MyComp/>);
expect(component.state.a).toEqual('a');
});
我很确定状态实际上是从承诺返回的数据中得到设置,但问题是我没有地方可以调用茉莉花'done()'函数来告诉茉莉花异步操作已经完成,并且可以测试对状态的断言。
React社区大多同意通过"好像"它是同步出现的,所以可以快照。这使我们的视图作为一个单一状态变量的函数,并使我们的代码易于测试。如果你没有在架构上投入——我建议你尝试像FLUX这样的架构,看看常见的库,比如redux和este。
也就是说,像您那样在AJAX之后显式地设置组件的状态是完全可以的。我将把测试分成两部分:
- 设置一个
state
变量来返回AJAX,您可以通过简单地检查对象是否更改来测试这一点。 - 调用
render
来重新渲染你正在测试的组件(而不是setState
)。
然后,您可以测试呈现和承诺设置不同的状态,使您的呈现测试易于推理(它们是同步的)和AJAX测试容易(它只是对象)。
一般来说,当你用mocha测试承诺时,你可以使用专用的承诺语法,因为你使用的是React,你也在使用Babel,所以你不妨在你的代码中使用新的JavaScript特性:
it('does ajax', async function(){ // can also `async () =>`
var result = await ajax.call(); // call the ajax, get response, can be mocked
var state = result;
var str = React.renderToString(<MyComp prop={result} />);
// assert against the returned HTML, can also test against DOM
});
相关文章:
- 测试iFrame的位置.href是在jasmine单元测试中设置的
- 测试MongoDB中未设置或丢失的字段
- 如何为多个需求模块设置单元测试
- Javascript 测试是否设置了变量
- 如何在量角器测试中设置$interval而不是超时
- javascript测试用于设置cookie的变量
- 在角度单元测试中将form设置为$valid
- Ionic V2和Cordova插件-未捕获类型错误:无法设置属性'测试'为null
- 可以'在尝试使用chai请求代理为测试维护用户会话时,t在发送标头后设置标头出错
- Protractor测试:如何设置登录表单中文本元素的值
- 有什么方法可以在超级测试中设置默认值吗
- 在Protractor测试中设置浏览器时区
- 如何设置谷歌分析以测试本地主机
- 如何使用 grunt 设置浏览器内测试
- 如何在多个文件中设置摩卡测试用例的执行顺序
- 为呈现的页面设置一个简单的幻影/摩卡测试
- 设置 Jasmine & Karma 来测试 Angular
- 在量角器测试中设置版边驱动程序首选项
- 通过ajax调用在componentDidMount中正确设置测试状态
- 尝试用摩卡,巴别塔和amp设置测试;es6模块