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;
this メソッドを使用できます。 ReactElementを返します。
let containerStyle = container.get(0).style;
expect(containerStyle).to.have.property('opacity', '1');
他の人の答えを少し詳しく説明します。
expect(component.find('#item-id').prop('style')).toHaveProperty('backgroundSize', '100%');
これにより、#item-id
のstyle
プロパティがチェックされます。この小道具はオブジェクトであり、toHaveProperty
matcherは、このオブジェクトにbackgroundSize
プロパティが含まれているかどうか、およびその値が100%
であるかどうかをチェックします。
これにより、他のスタイルプロパティは無視されます。
expect(component.find('#item-id').prop('style')).to.deep.equal({display: 'none'})
jest-styled-components を使用する場合、次のようにtoHaveStyleRule
を使用できます。
expect(component.find('#item-id')).toHaveStyleRule('opacity', 'red');
const elem = wrapper.find(Element);
expect(getComputedStyle(elem.getDOMNode()).getPropertyValue('opacity')).toBe('0.4');
ChaiEnzymeをご覧ください。chaiを使用すると、ラッパーに特定のスタイルがあるかどうかを確認できる便利な小さなアサーションが提供されます( https://github.com/producthunt/chai-enzyme#stylekey-val =)、テストを少し見やすくするのに役立ちます。
.html()
値でregex
を使用してみてください:
const span = mount(<Test />).find('span');
expect(span.html().match(/style="([^"]*)"/i)[1]).toBe('color: #000;');
または、他の属性を取得するには:
const getAttr = ( html, name ) => html.match(new RegExp(`${name}="([^"]*)"`, 'i'))[1];
let type = getAttr('<input type="text" value=""/>', 'type');
console.log(type); // "text"