2016-02-26 84 views
1
"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,下面是测试:ReactJS:我如何使用内部组件设置状态?

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 
); 

QuotationsetState它。

却得到了另一个错误:

https://github.com/yahoo/react-intl/issues/332#issuecomment-189394004

+0

'Quotation'是什么样的?它如何使用'react-intl'? –

+0

是的,我编辑了问题。谢谢 – emj365

+0

所以,这个问题与'react-intl'没有多大关系,它是关于如何模拟ajax调用来测试? –

回答

0

我没有测试这种方法。只是猜测。您需要将className属性设置为组件。在你的例子中,你会发现DIV元素,而不是你的组件。请尝试以下操作:

component = TestUtils.renderIntoDocument(
    <IntlProvider locale='en'> 
    <Quotation className="findme" url="https://test.com" pollInterval={1000}> 
     BTC/CNY 
    </Quotation> 
    </IntlProvider> 
); 

it('quotation unloaded',() => { 
    const quotation = TestUtils.findRenderedDOMComponentWithClass(
    component, 'findme' 
); 
    let lastPrice = TestUtils.findRenderedDOMComponentWithClass(
    component, 'last-price' 
); 
    quotation.setState({last: 1100, prevClose: 1000});// can't access it 
    expect(lastPrice.textContent).toEqual(1100); 
}); 

它工作吗?

+0

谢谢,但'findRenderedComponentWithType'可以做到。我有另一个错误,你可以检查该github链接。 – emj365