Testing the Tabs and Tab components
While updating pure functions with the new React 16.6 decorator memo()
, we found that the Navigation menu was broken, because material-ui handles props within the Tabs component, which my wrapper NavigationTabs isn't aware of.
In order to spot this kind of error in the future, we're trying to consolidate our test suite by making sure that if clicking on a tab, then updating the component, the new properties (eg selected=True) will be set as expected.
Unfortunately, we couldn't get his working. Please find our code below:
Menu Component
import React, {FC} from "react";
import Tabs from "@material-ui/core/Tabs";
import Tab from "@material-ui/core/Tab";
import history from "~/history";
import {MINISITE_TABS} from "~/constants";
import "./style.less";
const NavigationTabs: FC = () => (
<Tabs
className="minisite-navigation"
onChange={(event, tablink) => history.push(tablink)}
value={history.location.pathname}
>
{MINISITE_TABS.map(item => (
<Tab
label={item.label}
value={item.link}
key={item.label}
disableRipple
/>
))}
</Tabs>
);
export default NavigationTabs;
Test
import React from "react";
import {shallow} from "enzyme";
import history from "~/history";
import NavigationTabs from "../NavigationTabs";
describe("NavigationTabs Component", () => {
const wrapper = shallow(<NavigationTabs />).dive();
it("shows 4 tabs Navigation", () => {
expect(wrapper).toMatchSnapshot();
expect(wrapper.find("WithStyles(Tab)")).toHaveLength(4);
});
it("should change the page when a tab is clicked upon", () => {
let tab = wrapper
.dive()
.find("WithStyles(Tab)")
.first();
expect(tab.prop("selected")).toBeFalsy();
tab.simulate("click");
wrapper.find("Tabs").simulate("change", {}, "/story/tab1");
wrapper.update();
expect(history.push).toHaveBeenCalledWith("/story/tab1");
tab = wrapper
.dive()
.find("WithStyles(Tab)")
.first();
expect(tab.prop("selected")).toBeTruthy();
});
});
Error
NavigationTabs Component
✓ shows 4 tabs Navigation (12ms)
✕ should change the page when a tab is clicked upon (14ms)
● NavigationTabs Component › should change the page when a tab is clicked upon
expect(received).toBeTruthy()
Received: false
29 | .find("WithStyles(Tab)")
30 | .first();
> 31 | expect(tab.prop("selected")).toBeTruthy();
| ^
32 | });
33 | });
34 |
at Object.toBeTruthy (src/components/pages/MiniSite/Navigation/__tests__/NavigationTabs-test.js:31:34)
Test Suites: 1 failed, 1 total
Tests: 1 failed, 1 passed, 2 total
Snapshots: 1 passed, 1 total
Time: 1.968s, estimated 2s
Ran all test suites matching /NavigationTabs/i.
Versions:
- React 16.6.3
- Enzyme 3.7.0
- Jest 23.6.0
- Material-ui 3.1.2
How would you go about testing this scenario ?
reactjs jestjs material-ui enzyme
add a comment |
While updating pure functions with the new React 16.6 decorator memo()
, we found that the Navigation menu was broken, because material-ui handles props within the Tabs component, which my wrapper NavigationTabs isn't aware of.
In order to spot this kind of error in the future, we're trying to consolidate our test suite by making sure that if clicking on a tab, then updating the component, the new properties (eg selected=True) will be set as expected.
Unfortunately, we couldn't get his working. Please find our code below:
Menu Component
import React, {FC} from "react";
import Tabs from "@material-ui/core/Tabs";
import Tab from "@material-ui/core/Tab";
import history from "~/history";
import {MINISITE_TABS} from "~/constants";
import "./style.less";
const NavigationTabs: FC = () => (
<Tabs
className="minisite-navigation"
onChange={(event, tablink) => history.push(tablink)}
value={history.location.pathname}
>
{MINISITE_TABS.map(item => (
<Tab
label={item.label}
value={item.link}
key={item.label}
disableRipple
/>
))}
</Tabs>
);
export default NavigationTabs;
Test
import React from "react";
import {shallow} from "enzyme";
import history from "~/history";
import NavigationTabs from "../NavigationTabs";
describe("NavigationTabs Component", () => {
const wrapper = shallow(<NavigationTabs />).dive();
it("shows 4 tabs Navigation", () => {
expect(wrapper).toMatchSnapshot();
expect(wrapper.find("WithStyles(Tab)")).toHaveLength(4);
});
it("should change the page when a tab is clicked upon", () => {
let tab = wrapper
.dive()
.find("WithStyles(Tab)")
.first();
expect(tab.prop("selected")).toBeFalsy();
tab.simulate("click");
wrapper.find("Tabs").simulate("change", {}, "/story/tab1");
wrapper.update();
expect(history.push).toHaveBeenCalledWith("/story/tab1");
tab = wrapper
.dive()
.find("WithStyles(Tab)")
.first();
expect(tab.prop("selected")).toBeTruthy();
});
});
Error
NavigationTabs Component
✓ shows 4 tabs Navigation (12ms)
✕ should change the page when a tab is clicked upon (14ms)
● NavigationTabs Component › should change the page when a tab is clicked upon
expect(received).toBeTruthy()
Received: false
29 | .find("WithStyles(Tab)")
30 | .first();
> 31 | expect(tab.prop("selected")).toBeTruthy();
| ^
32 | });
33 | });
34 |
at Object.toBeTruthy (src/components/pages/MiniSite/Navigation/__tests__/NavigationTabs-test.js:31:34)
Test Suites: 1 failed, 1 total
Tests: 1 failed, 1 passed, 2 total
Snapshots: 1 passed, 1 total
Time: 1.968s, estimated 2s
Ran all test suites matching /NavigationTabs/i.
Versions:
- React 16.6.3
- Enzyme 3.7.0
- Jest 23.6.0
- Material-ui 3.1.2
How would you go about testing this scenario ?
reactjs jestjs material-ui enzyme
add a comment |
While updating pure functions with the new React 16.6 decorator memo()
, we found that the Navigation menu was broken, because material-ui handles props within the Tabs component, which my wrapper NavigationTabs isn't aware of.
In order to spot this kind of error in the future, we're trying to consolidate our test suite by making sure that if clicking on a tab, then updating the component, the new properties (eg selected=True) will be set as expected.
Unfortunately, we couldn't get his working. Please find our code below:
Menu Component
import React, {FC} from "react";
import Tabs from "@material-ui/core/Tabs";
import Tab from "@material-ui/core/Tab";
import history from "~/history";
import {MINISITE_TABS} from "~/constants";
import "./style.less";
const NavigationTabs: FC = () => (
<Tabs
className="minisite-navigation"
onChange={(event, tablink) => history.push(tablink)}
value={history.location.pathname}
>
{MINISITE_TABS.map(item => (
<Tab
label={item.label}
value={item.link}
key={item.label}
disableRipple
/>
))}
</Tabs>
);
export default NavigationTabs;
Test
import React from "react";
import {shallow} from "enzyme";
import history from "~/history";
import NavigationTabs from "../NavigationTabs";
describe("NavigationTabs Component", () => {
const wrapper = shallow(<NavigationTabs />).dive();
it("shows 4 tabs Navigation", () => {
expect(wrapper).toMatchSnapshot();
expect(wrapper.find("WithStyles(Tab)")).toHaveLength(4);
});
it("should change the page when a tab is clicked upon", () => {
let tab = wrapper
.dive()
.find("WithStyles(Tab)")
.first();
expect(tab.prop("selected")).toBeFalsy();
tab.simulate("click");
wrapper.find("Tabs").simulate("change", {}, "/story/tab1");
wrapper.update();
expect(history.push).toHaveBeenCalledWith("/story/tab1");
tab = wrapper
.dive()
.find("WithStyles(Tab)")
.first();
expect(tab.prop("selected")).toBeTruthy();
});
});
Error
NavigationTabs Component
✓ shows 4 tabs Navigation (12ms)
✕ should change the page when a tab is clicked upon (14ms)
● NavigationTabs Component › should change the page when a tab is clicked upon
expect(received).toBeTruthy()
Received: false
29 | .find("WithStyles(Tab)")
30 | .first();
> 31 | expect(tab.prop("selected")).toBeTruthy();
| ^
32 | });
33 | });
34 |
at Object.toBeTruthy (src/components/pages/MiniSite/Navigation/__tests__/NavigationTabs-test.js:31:34)
Test Suites: 1 failed, 1 total
Tests: 1 failed, 1 passed, 2 total
Snapshots: 1 passed, 1 total
Time: 1.968s, estimated 2s
Ran all test suites matching /NavigationTabs/i.
Versions:
- React 16.6.3
- Enzyme 3.7.0
- Jest 23.6.0
- Material-ui 3.1.2
How would you go about testing this scenario ?
reactjs jestjs material-ui enzyme
While updating pure functions with the new React 16.6 decorator memo()
, we found that the Navigation menu was broken, because material-ui handles props within the Tabs component, which my wrapper NavigationTabs isn't aware of.
In order to spot this kind of error in the future, we're trying to consolidate our test suite by making sure that if clicking on a tab, then updating the component, the new properties (eg selected=True) will be set as expected.
Unfortunately, we couldn't get his working. Please find our code below:
Menu Component
import React, {FC} from "react";
import Tabs from "@material-ui/core/Tabs";
import Tab from "@material-ui/core/Tab";
import history from "~/history";
import {MINISITE_TABS} from "~/constants";
import "./style.less";
const NavigationTabs: FC = () => (
<Tabs
className="minisite-navigation"
onChange={(event, tablink) => history.push(tablink)}
value={history.location.pathname}
>
{MINISITE_TABS.map(item => (
<Tab
label={item.label}
value={item.link}
key={item.label}
disableRipple
/>
))}
</Tabs>
);
export default NavigationTabs;
Test
import React from "react";
import {shallow} from "enzyme";
import history from "~/history";
import NavigationTabs from "../NavigationTabs";
describe("NavigationTabs Component", () => {
const wrapper = shallow(<NavigationTabs />).dive();
it("shows 4 tabs Navigation", () => {
expect(wrapper).toMatchSnapshot();
expect(wrapper.find("WithStyles(Tab)")).toHaveLength(4);
});
it("should change the page when a tab is clicked upon", () => {
let tab = wrapper
.dive()
.find("WithStyles(Tab)")
.first();
expect(tab.prop("selected")).toBeFalsy();
tab.simulate("click");
wrapper.find("Tabs").simulate("change", {}, "/story/tab1");
wrapper.update();
expect(history.push).toHaveBeenCalledWith("/story/tab1");
tab = wrapper
.dive()
.find("WithStyles(Tab)")
.first();
expect(tab.prop("selected")).toBeTruthy();
});
});
Error
NavigationTabs Component
✓ shows 4 tabs Navigation (12ms)
✕ should change the page when a tab is clicked upon (14ms)
● NavigationTabs Component › should change the page when a tab is clicked upon
expect(received).toBeTruthy()
Received: false
29 | .find("WithStyles(Tab)")
30 | .first();
> 31 | expect(tab.prop("selected")).toBeTruthy();
| ^
32 | });
33 | });
34 |
at Object.toBeTruthy (src/components/pages/MiniSite/Navigation/__tests__/NavigationTabs-test.js:31:34)
Test Suites: 1 failed, 1 total
Tests: 1 failed, 1 passed, 2 total
Snapshots: 1 passed, 1 total
Time: 1.968s, estimated 2s
Ran all test suites matching /NavigationTabs/i.
Versions:
- React 16.6.3
- Enzyme 3.7.0
- Jest 23.6.0
- Material-ui 3.1.2
How would you go about testing this scenario ?
reactjs jestjs material-ui enzyme
reactjs jestjs material-ui enzyme
edited Nov 26 '18 at 16:11
LazerBass
1,48031124
1,48031124
asked Nov 26 '18 at 7:12
FandekaspFandekasp
503217
503217
add a comment |
add a comment |
0
active
oldest
votes
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53476234%2ftesting-the-tabs-and-tab-components%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
0
active
oldest
votes
0
active
oldest
votes
active
oldest
votes
active
oldest
votes
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53476234%2ftesting-the-tabs-and-tab-components%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown