material-uiに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);
正確な問題、再現する最小コード、および失敗したJESTテストを含むCodeSandboxを含めました。
.MuiButtonBase-root-33 background-colorは透明ですが、.MuiButton-containedPrimary-13は透明ではありません-したがって問題は、CSSのクラスは同等に重要であるため、ロード順序だけがそれらを区別することです->テストスタイルでは、間違った順序でロードされます。
—
Zydnar
@Andreas-要求に応じて更新
—
Simon Long
@Zyndar-はい、知っています。このテストに合格させる方法はありますか?
—
Simon Long、
theme
テストで使用する必要はありませんか?のように、でラップ<MyStyledButton>
し<MuiThemeProvider theme={theme}>
ますか?または、ラッパー関数を使用してすべてのコンポーネントにテーマを追加しますか?
いいえ、違いはありません。
—
Simon Long