Я написал пользовательскую кнопку ( MyStyledButton
) на основе материала-интерфейса 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;
Это стилизовано с использованием темы, и это указывает, backgroundColor
чтобы быть оттенком желтого (Специально #fbb900
)
import { createMuiTheme } from "@material-ui/core/styles";
export const myYellow = "#FBB900";
export const theme = createMuiTheme({
overrides: {
MuiButton: {
containedPrimary: {
color: "black",
backgroundColor: myYellow
}
}
}
});
Компонент создается в моем основном index.js
и упакован в theme
.
<MuiThemeProvider theme={theme}>
<MyStyledButton variant="contained" color="primary">
Primary Click Me
</MyStyledButton>
</MuiThemeProvider>
Если я исследую кнопку в Chrome DevTools, то background-color
она «вычисляется», как и ожидалось. Это также относится и к Firefox DevTools.
Однако, когда я пишу JEST-тест для проверки background-color
и запрашиваю стиль узла DOM кнопки, getComputedStyles()
я transparent
возвращаюсь, и тест завершается неудачей.
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);
Я включил CodeSandbox с точной проблемой, минимальным кодом для воспроизведения и провальным JEST-тестом.
theme
нужно ли использовать в тесте? Как и в, оберните<MyStyledButton>
в<MuiThemeProvider theme={theme}>
? Или использовать какую-нибудь функцию-обертку, чтобы добавить тему ко всем компонентам?Ответы:
Я подошел ближе, но пока не совсем в решении.
Основная проблема заключается в том, что MUIButton внедряет тег в элемент для включения стилей. Это не происходит в вашем модульном тесте. Я смог заставить это работать, используя createMount, который используют тесты материала.
После этого исправления стиль отображается правильно. Тем не менее, вычисленный стиль все еще не работает. Похоже, у других возникли проблемы с правильной обработкой ферментами, поэтому я не уверен, возможно ли это.
Чтобы добраться туда, где я был, возьмите свой тестовый фрагмент, скопируйте его в начало и затем измените свой тестовый код на:
источник