2016-11-24 4 views
10

Я пытаюсь проверить атрибут стиля для компонента React. Каков наилучший способ получить параметры стиля в тесте?Как проверить стиль для атрибута компонента React с Enzyme

На данный момент мой лучший вариант - проверить, содержит ли 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; 
+0

эй jacefarm, какую конфигурацию вы используете для шутки, чтобы использовать sass (scss)? Я имею в виду, что у меня есть следующий '' moduleNameMapper: { "\\. (Scss | css) $": " /src/sassMockForJest.js" }, но я получил неопределенные ошибки при использовании свойств, например, если я использовал тот же компонент, что и вы, я бы посмотрел 'Can not read property 'textCenter' undefined', потому что' $ {gc.textCenter} ' –

ответ

1

Посмотрите chaiEnzyme, который обеспечивает удобное маленькое утверждение можно использовать с Chai, чтобы проверить, имеет ли оболочка особый стиль (https://github.com/producthunt/chai-enzyme#stylekey-val), должен помочь сделать ваши тесты немного чище.

2

Вы можете попробовать с помощью regex на .html() значение:

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" 
15

Вы можете использовать this метод. Он возвращает ReactElement.

let containerStyle = container.get(0).style; 
expect(containerStyle).to.have.property('opacity', '1'); 
+3

Для тех, кто использует Jest, обратите внимание, что это должно быть' ожидать (...). toHaveProperty (...). –

4

expect(component.find('#item-id').prop('style')).to.deep.equal({display: 'none'})

+0

Глубина очень важна здесь thanx –

2

Немного уточняя ответы друга:

expect(component.find('#item-id').prop('style')).toHaveProperty('backgroundSize', '100%'); 

Это будет проверять style опора #item-id. Эта поддержка является объектом, и здесь toHaveProperty matcher проверяет, содержит ли этот объект backgroundSize и его значение равно 100%.

Таким образом, другие свойства стиля игнорируются.

Смежные вопросы