Jeyashree .A
Jeyashree .A

Reputation: 17

Instance returns NULL for connected component on mount in Jest

I am relatively new to react and apologies for any terms that dont fit the jargon.

I am trying to test a prototype method of a connected component which consists of a ref variable, as below:

app.js

export class Dashboard extends React.Component { // Exporting here as well
  constructor(props) {
    this.uploadFile = React.createRef();

    this.uploadJSON = this.uploadJSON.bind(this);
  }

  uploadJSON () { 
     //Function that I am trying to test
     //Conditions based on this.uploadFile
  }
render() {
    return (
      <div className="dashboard wrapper m-padding">
        <div className="dashboard-header clearfix">
          <input
            type="file"
            ref={this.uploadFile}
            webkitdirectory="true"
            mozdirectory="true"
            hidden
            onChange={this.uploadJSON}
            onClick={this.someOtherFn}
          />
        </div>
        <SensorStatList />
        <GraphList />
      </div>
    );
  }

  const mapStateToProps = state => ({
    //state
  });

  const mapDispatchToProps = dispatch => ({
    //actions
  });

  export default connect(
    mapStateToProps,
    mapDispatchToProps
  )(Dashboard);
}

Here, SensorStatList and GraphList are functional components, also connected using redux.

After some research I have my test file to this level:

app.test.js

import { Dashboard } from '../Dashboard';
import { Provider } from 'react-redux';
import configureStore from '../../../store/store';

const store = configureStore();

export const CustomProvider = ({ children }) => {
    return (
      <Provider store={store}>
        {children}
      </Provider>
    );
  };

describe("Dashboard", () => {

    let uploadJSONSpy = null;

    function mountSetup () {
        const wrapper = mount(
                <CustomProvider>
                  <Dashboard />
                </CustomProvider>
              );
        return {
            wrapper
        };
    }

    it("should read the file", () => {
        const { wrapper } = mountSetup();
        let DashboardWrapper = wrapper;

        let instance = DashboardWrapper.instance();

        console.log(instance.ref('uploadFile')) // TypeError: Cannot read property 'ref' of null
    })

Can someone help me understand why this error

console.log(instance.ref('uploadFile')) // TypeError: Cannot read property 'ref' of null

pops up? Also, if this approach is fine? If not, what are the better options?

Upvotes: 0

Views: 3869

Answers (1)

Estus Flask
Estus Flask

Reputation: 222369

wrapper is CustomProvider which has no instance, and ref is supposed to work with deprecated string refs.

In case a ref should be accessed on Dashboard, it can be:

wrapper.find(Dashboard).first().instance().uploadFile.current

In case input wrapper should be accessed, it can be:

wrapper.find('input').first()

Upvotes: 1

Related Questions