我正在尝试测试 React 组件的样式属性。在测试中获取样式参数的最佳方法是什么?
目前,我最好的选择是测试 HTML 是否包含字符串,但我认为还有更好的选择。
案件:
it('Should render large image when desktop', () => { const dummyUrl = 'http://dummyUrl'; const wrapper = shallow( <MockedStore initialState={{ app: fromJS({ browser: { desktop: true } }), }} > <LandingHero bigImage={dummyUrl} /> </MockedStore> ); });
要测试的组件是:
// @flow import React, { Component } from 'react'; import gc from 'styles/core.scss'; import $ from 'jquery'; import DownloadButton from 'components/DownloadButton'; import withStyles from 'isomorphic-style-loader/lib/withStyles'; import DownArrow from 'components/DownArrow'; import { connect } from 'react-redux'; import type { Map } from 'immutable'; import c from './styles.scss'; @withStyles([gc, c]) @connect(({ app }) => ({ app })) class LandingHero extends Component { componentDidMount() { if ($(window).height() > 0) { // Necesary for webpack dev server $(this.hero).css('height', $(window).height() - 46); } } hero: HTMLElement; props: { app: Map<string, any>, copy: string, secondaryText: string, thirdText: string, bigImage?: string, smallImage: string, } render() { const { copy, secondaryText, thirdText } = this.props; const browser = this.props.app.has('browser') ? this.props.app.get('browser') : {}; const backgroundImage = browser.desktop ? this.props.bigImage : this.props.smallImage; return ( <div className={`${c.hero} ${gc.textCenter}` + ` ${gc.alignMiddle} ${gc.alignCenter} ${gc.row} ${gc.expanded}`} ref={(hero) => { this.hero = hero; }} style={{ margin: 0, position: 'relative', background: `linear-gradient(to bottom, rgba($ixdarkprimary, .3), rgba($ixdarkprimary, .3)), url(${backgroundImage || ''})`, }} > <div className={`${gc.row} ${gc.alignCenter} ${gc.alignMiddle} ${gc.column} ${gc.medium10}`}> <div className={`${gc.textCenter}`}> <div className={`${gc.white} ${c.mainText} ${c.copy}`} > { copy } </div> <div className={`${gc.small6} ${gc.smallOffset3} ${gc.medium4} ${gc.mediumOffset4}`} style={{ marginBottom: 45 }}> <DownloadButton /> </div> <div className={`${gc.white} ${gc.fontBold} ${gc.font24}`}>{secondaryText}</div> <p className={`${gc.white} ${gc.font20}`}>{thirdText}</p> </div> <DownArrow goTo="#content" /> </div> </div> ); } } export default LandingHero;
你可以使用这个方法。它返回 ReactElement。
let containerStyle = container.get(0).style; expect(containerStyle).to.have.property('opacity', '1');