【发布时间】:2016-06-09 13:10:12
【问题描述】:
"use strict";
import React, { Component, PropTypes } from 'react';
import { FormattedNumber } from 'react-intl';
import $ from 'jquery';
const Increase = require('../Increase').default;
class Quotation extends Component {
constructor(props) {
super(props);
this.state = {
last: undefined,
prevClose: undefined
};
}
componentDidMount() {
this.loadFromServer(this.props.url);
setInterval((() => {
this.loadFromServer(this.props.url);
}).bind(this), this.props.pollInterval);
}
loadFromServer(url) {
$.ajax({
url: url,
dataType: 'json',
cache: false,
success: function(data) {
this.setState({last: parseFloat(data.ticker.last)});
this.setState({prevClose: parseFloat(data.ticker.prev_close)});
}.bind(this),
error: function(xhr, status, err) {
console.error(url, status, err.toString());
}
});
}
number(n) {
if (n == undefined) {
return '...'
}
return (
<FormattedNumber
value={n}
maximumFractionDigits={2}
minimumFractionDigits={2}
/>
);
}
render() {
return (
<div className="quotation">
<div className="title">{this.props.children}</div>
<div className="last-price">
{this.number(this.state.last)}
</div>
<Increase last={this.state.last}
prevClose={this.state.prevClose} />
</div>
);
}
}
Quotation.propTypes = {
url: PropTypes.string.isRequired,
pollInterval: PropTypes.number.isRequired,
children: PropTypes.string.isRequired
};
Quotation.getDefaultProps = {
};
export default Quotation;
增加使用react-intl,下面是测试:
component = TestUtils.renderIntoDocument(
<IntlProvider locale='en'>
<Quotation url="https://test.com" pollInterval={1000}>
BTC / CNY
</Quotation>
</IntlProvider>
);
it('quotation unloaded', () => {
const quotation = TestUtils.findRenderedDOMComponentWithClass(
component, 'quotation'
);
let lastPrice = TestUtils.findRenderedDOMComponentWithClass(
component, 'last-price'
);
quotation.setState({last: 1100, prevClose: 1000});// can't access it
expect(lastPrice.textContent).toEqual(1100);
});
我正在测试我的 reactJS 组件。
因为我使用了react-intl。我必须使用IntlProvider 来渲染它。
如何设置Quotation的状态?
更新: 我用:
let quotation = TestUtils.findRenderedComponentWithType(
component, Quotation
);
得到了Quotation 和setState。
但又出现了一个错误:
https://github.com/yahoo/react-intl/issues/332#issuecomment-189394004
【问题讨论】:
-
Quotation看起来像什么?它如何使用react-intl? -
是的,我编辑了问题。谢谢
-
所以,这个问题和
react-intl没有太大关系,是关于如何模拟一个ajax调用进行测试的? -
我想在组件(IntlProvider)中将setState设置为引用
-
当它没有 IntlProvider 包装器时,我可以直接 setState。但现在我必须用它包装
IntlProvider。
标签: reactjs react-jsx react-intl