Testing the Tabs and Tab components












0















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 ?










share|improve this question





























    0















    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 ?










    share|improve this question



























      0












      0








      0








      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 ?










      share|improve this question
















      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






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 26 '18 at 16:11









      LazerBass

      1,48031124




      1,48031124










      asked Nov 26 '18 at 7:12









      FandekaspFandekasp

      503217




      503217
























          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
          });


          }
          });














          draft saved

          draft discarded


















          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
















          draft saved

          draft discarded




















































          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.




          draft saved


          draft discarded














          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





















































          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







          Popular posts from this blog

          Wiesbaden

          Marschland

          Dieringhausen