He escrito un botón personalizado ( MyStyledButton
) basado en material-ui Button
.
import React from "react";
import { Button } from "@material-ui/core";
import { makeStyles } from "@material-ui/styles";
const useStyles = makeStyles({
root: {
minWidth: 100
}
});
function MyStyledButton(props) {
const buttonStyle = useStyles(props);
const { children, width, ...others } = props;
return (
<Button classes={{ root: buttonStyle.root }} {...others}>
{children}
</Button>
);
}
export default MyStyledButton;
Está diseñado con un tema y esto especifica backgroundColor
que debe ser un tono de amarillo (Específicamente #fbb900
)
import { createMuiTheme } from "@material-ui/core/styles";
export const myYellow = "#FBB900";
export const theme = createMuiTheme({
overrides: {
MuiButton: {
containedPrimary: {
color: "black",
backgroundColor: myYellow
}
}
}
});
El componente se instancia en mi main index.js
y se envuelve en el theme
.
<MuiThemeProvider theme={theme}>
<MyStyledButton variant="contained" color="primary">
Primary Click Me
</MyStyledButton>
</MuiThemeProvider>
Si examino el botón en Chrome DevTools, background-color
se "calcula" como se esperaba. Este es también el caso en Firefox DevTools.
Sin embargo, cuando escribo una prueba JEST para verificar background-color
y consulto el estilo del nodo DOM, si uso el botón getComputedStyles()
, transparent
regreso y la prueba falla.
const wrapper = mount(
<MyStyledButton variant="contained" color="primary">
Primary
</MyStyledButton>
);
const foundButton = wrapper.find("button");
expect(foundButton).toHaveLength(1);
//I want to check the background colour of the button here
//I've tried getComputedStyle() but it returns 'transparent' instead of #FBB900
expect(
window
.getComputedStyle(foundButton.getDOMNode())
.getPropertyValue("background-color")
).toEqual(myYellow);
He incluido un CodeSandbox con el problema exacto, el código mínimo para reproducir y la prueba JEST que falla.
theme
necesario utilizarlo en la prueba? Como en, envolver el<MyStyledButton>
en el<MuiThemeProvider theme={theme}>
? ¿O utiliza alguna función de contenedor para agregar el tema a todos los componentes?Respuestas:
Me he acercado, pero todavía no estoy en una solución.
El problema principal es que MUIButton inyecta una etiqueta al elemento para potenciar los estilos. Esto no está sucediendo en su prueba de unidad. Pude hacer que esto funcionara usando createMount que usan las pruebas de material.
Después de esta corrección, el estilo se muestra correctamente. Sin embargo, el estilo calculado aún no funciona. Parece que otros han tenido problemas con el manejo correcto de las enzimas, por lo que no estoy seguro de si es posible.
Para llegar a donde estaba, tome su fragmento de prueba, cópielo en la parte superior y luego cambie su código de prueba a:
fuente