Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Set state with React Shallow Rendering

Tags:

reactjs

I want to test a React component with Shallow Rendering. But I want to test the component depending on its state.

What is the proper way of doing so? I have tried this:

  component = shallowRenderer.render(
    <TweetsBox
      users = 4
    />
  );
  component.setState({initial: true}); // This is not allowed

  renderResult = shallowRenderer.getRenderOutput();

But I can't make it work. What is the proper way of setting the state when doing shallow rendering?

like image 439
Hommer Smith Avatar asked Jun 12 '15 18:06

Hommer Smith


1 Answers

It doesn't look like the shallowRenderer returned by React.addons.TestUtils.createRenderer has the ability to do much aside from render based on the component, props, and children passed in.

I had to use jsdom + React.addons.TestUtils.renderIntoDocument to set state via an event (as @neil-kistner commented). I imagine it's the same if you want to call setState directly.

Here's what worked for me:

import jsdom from "jsdom";
global.document = jsdom.jsdom("<!doctype html><html><body></body></html>");
global.window = document.parentWindow;
global.navigator = {
  userAgent: "node.js"
};
import React from "react/addons";
const TestUtils = React.addons.TestUtils;
import PriceAtTotalQuantity from "app/components/PriceAtTotalQuantity";
import { assert } from "chai";

describe("app/components/PriceAtTotalQuantity", function() {
  it("should show tooltip on mouseover", function() {
    const props = {
      currencyCode: "USD",
      offer: {
        priceWasConverted: true,
        priceAtTotalQuantity: 0.1
      }
    };
    var priceAtTotalQuantity = TestUtils.renderIntoDocument(React.createElement(PriceAtTotalQuantity, props));
    var currencyCodeNode = TestUtils.findRenderedDOMComponentWithClass(priceAtTotalQuantity, "currency-code").getDOMNode();
    assert.isFalse(priceAtTotalQuantity.state.tooltipIsVisible);
    TestUtils.Simulate.mouseOver(currencyCodeNode);
    assert.isTrue(priceAtTotalQuantity.state.tooltipIsVisible);    
  });
});
like image 107
markplindsay Avatar answered Oct 19 '22 02:10

markplindsay