Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Angularjs test with Jest module injection

Trying to test angular services with Jest and got this error:

[$injector:nomod] Module 'superag' is not available! You either misspelled the module name or forgot to load it. If registering a module ensure that you specify the dependencies as the second argument.

How do I mock my module 'superag' and make available to mathService?

Do I have to import the app.js file with the module declaration every test I make?

Ps.: I've tried with beforeEach(module('superag')) too without success

package.json

"jest": {
    "collectCoverageFrom": [
      "**/*.{js}",
      "!**/node_modules/**"
    ]
  },
  "devDependencies": {
    "angular-mocks": "^1.6.9",
    "jest-cli": "^23.0.0-alpha.0"
  },
  "dependencies": {
    "angular": "^1.6.9"
  }
}

math.service.js

function MathService(){

    var addTwoNumbers = function(x, y){
      return x + y;
    };

    return {
      addTwoNumbers
    };
  }
angular.module('superag').factory('mathservice', MathService);

math.service.test.js

require('angular');
require('angular-mocks');
require('./math.service.js');

describe('Math service - addTwoNumbers', () => {

  beforeEach(
    angular.mock.module('superag')
  );

  var _mathservice;

  beforeEach(inject((mathservice) => {
    _mathservice = mathservice;
  }));

  it('1 + 1 should equal 2', () => {
    var actual = _mathservice.addTwoNumbers(1,1);
    expect(actual).toEqual(2);
  });

});
like image 714
Roger Ramos Avatar asked Mar 20 '18 13:03

Roger Ramos


1 Answers

This error occurs when you declare a dependency on a module that isn't defined anywhere or hasn't been loaded in the current browser context.

When you receive this error, check that the name of the module in question is correct and that the file in which this module is defined has been loaded (either via <script> tag, loader like require.js, or testing harness like karma).

A less common reason for this error is trying to "re-open" a module that has not yet been defined.

To define a new module, call angular.module with a name and an array of dependent modules, like so:

// When defining a module with no module dependencies,
// the array of dependencies should be defined and empty.
var myApp = angular.module('myApp', []);

To retrieve a reference to the same module for further configuration, call angular.module without the array argument.

var myApp = angular.module('myApp');

Calling angular.module without the array of dependencies when the module has not yet been defined causes this error to be thrown. To fix it, define your module with a name and an empty array, as in the first example above.

like image 100
Ria Anggraini Avatar answered Sep 29 '22 11:09

Ria Anggraini