Search code examples
jqueryreactjsjestjsreactjs-testutils

React component using jQuery without require - jest unit tests


I have a very simple React mixin which uses jQuery to trigger an event

MyMixin = {
  trackStructEvent: function () {
    args = Array.prototype.slice.call(arguments);
    $('body').trigger('myEvent', args);
  }
module.exports = MyMixin

This is imported into the main site as part of a new set of components using browserify. As the main site holding these components will always include jQuery, I don't want to require jQuery with browserify, as it will be duplicated.

This isn't an issue in terms of behaviour - however it causes problems when running jest to unit test the components using this mixin throwing the error.

ReferenceError: $ is not defined

I know I can fix this by including jQuery through browserify, but that will load 2 copies into my site.

Is there any way in jest to tell my react component that jQuery already exists on the window and not to worry about it?


Solution

  • I have a similar problem but I think where i've got to so far solves your problem. You need to use require inside your react files to define jQuery under $

    var $ = require('jquery');
    
    MyMixin = {
       trackStructEvent: function () {
          args = Array.prototype.slice.call(arguments);
          $('body').trigger('myEvent', args);
       }
    module.exports = MyMixin
    

    You then need to tell jest not to mock jquery

    jest.dontMock('jquery')
    

    Then your jest unit tests should pass (assuming they aren't verifying things that jQuery is doing - this is where my tests are falling over).

    You also need to tell browserify that jQuery is external then the result will be that all your references to $ have been defined, the jquery library is loaded for testing but is not included in your browserify bundle. (use browserify-shim)