test spec shallowwrapper shallow react reactjs enzyme

reactjs - spec - shallowwrapper enzyme



Cómo probar el estilo para un atributo de componente React con enzima (7)

Estoy tratando de probar un atributo de estilo para un componente React. ¿Cuál es la mejor manera de obtener parámetros de estilo en la prueba?

En este momento, mi mejor opción es probar si el HTML incluye la cadena, pero creo que hay una mejor opción.

Caso:

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

El componente a probar es:

// @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;


Eche un vistazo a chaiEnzyme, que proporciona una pequeña aserción práctica que puede usar con chai para verificar si un envoltorio tiene un estilo particular ( https://github.com/producthunt/chai-enzyme#stylekey-val ), que lo ayude a hacer de su Las pruebas se ven un poco más limpias.


Elaborando un poco las respuestas de los demás:

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

Esto verificará el style prop de #item-id . Este prop es un objeto y aquí toHaveProperty tener un toHaveProperty propiedad que comprueba si este objeto contiene backgroundSize propiedad backgroundSize y si su valor es del 100% .

De esta manera se ignoran otras propiedades de estilo.


Puede utilizar this método. Devuelve ReactElement.

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


Puedes intentar usar una regex en el valor .html() :

const span = mount(<Test />).find(''span''); expect(span.html().match(/style="([^"]*)"/i)[1]).toBe(''color: #000;'');

O para obtener cualquier otro atributo:

const getAttr = ( html, name ) => html.match(new RegExp(`${name}="([^"]*)"`, ''i''))[1]; let type = getAttr(''<input type="text" value=""/>'', ''type''); console.log(type); // "text"


Si usa jest-styled-components puede usar toHaveStyleRule siguiente manera:

expect(component.find(''#item-id'')).toHaveStyleRule(''opacity'', ''red'');


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


const elem = wrapper.find(Element); expect(getComputedStyle(elem.getDOMNode()).getPropertyValue(''opacity'')).toBe(''0.4'');