J'ai écrit un bouton personnalisé ( MyStyledButton
) basé sur 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;
Il est stylisé à l'aide d'un thème, ce qui spécifie qu'il backgroundColor
doit être une nuance de jaune (spécialement #fbb900
)
import { createMuiTheme } from "@material-ui/core/styles";
export const myYellow = "#FBB900";
export const theme = createMuiTheme({
overrides: {
MuiButton: {
containedPrimary: {
color: "black",
backgroundColor: myYellow
}
}
}
});
Le composant est instancié dans mon principal index.js
et enveloppé dans le theme
.
<MuiThemeProvider theme={theme}>
<MyStyledButton variant="contained" color="primary">
Primary Click Me
</MyStyledButton>
</MuiThemeProvider>
Si j'examine le bouton dans Chrome DevTools, il background-color
est "calculé" comme prévu. C'est également le cas dans Firefox DevTools.
Cependant, lorsque j'écris un test JEST pour vérifier le background-color
et que je recherche le style de nœud DOM du bouton à l'aide du bouton getComputedStyles()
Je transparent
reviens et le test échoue.
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);
J'ai inclus un CodeSandbox avec le problème exact, le code minimum à reproduire et l'échec du test JEST.
theme
besoin ne serait-il pas utilisé dans le test? Comme dans, enveloppez le<MyStyledButton>
dans le<MuiThemeProvider theme={theme}>
? Ou utiliser une fonction wrapper pour ajouter le thème à tous les composants?Réponses:
Je me suis rapproché, mais je n'ai pas encore trouvé de solution.
Le principal problème est que MUIButton injecte une balise à l'élément pour alimenter les styles. Cela ne se produit pas dans votre test unitaire. J'ai pu faire fonctionner cela en utilisant le createMount que les tests de matériaux utilisent.
Après ce correctif, le style s'affiche correctement. Cependant, le style calculé ne fonctionne toujours pas. Il semble que d'autres ont rencontré des problèmes avec la manipulation correcte des enzymes - donc je ne sais pas si c'est possible.
Pour arriver là où j'étais, prenez votre extrait de test, copiez-le en haut, puis changez votre code de test en:
la source