Is it possible to override constants for module config functions in tests?

angularjs, angularjs-module

Solution

First of all: it seems that jasmine is not working properly in your plunkr. But I am not quite sure – maybe someone else can check this again. Nevertheless I have created a new plunkr (http://plnkr.co/edit/MkUjSLIyWbj5A2Vy6h61?p=preview) and followed these instructions: https://github.com/searls/jasmine-all.

You will see that your `beforeEach` code will never run. You can check this:

module(function($provide) {
  console.log('you will never see this');
  $provide.constant('I18n', { FOO: "bar"});
});

You need two things:

A real test in the `it` function – `expect(true).toBe(true)` is good enough

You must use `inject` somewhere in your test, otherwise the function provided to `module` will not be called and the constant will not be set.

If you run this code you will see "green":

var common = angular.module('common', []);

common.constant('I18n', 'foo');
common.config(['I18n', function(I18n) {
  console.log("common I18n " + I18n)
}]);

var app = angular.module('plunker', ['common']);
app.config(['I18n', function(I18n) {
  console.log("plunker I18n " + I18n)
}]);

describe('tests', function() {

  beforeEach(module('common'));
  beforeEach(function() {
    module(function($provide) {
      console.log('change to bar');
      $provide.constant('I18n', 'bar');
    });
  });
  beforeEach(module('plunker'));    

  it('anything looks great', inject(function($injector) {
      var i18n = $injector.get('I18n');
      expect(i18n).toBe('bar');
  }));
});

I hope it will work as you expect!

Problem

I've spent quite a while banging my head against trying to override injected constants provided to modules' config functions. My code looks something like ``` common.constant('I18n', <provided by server, comes up as undefined in tests>); common.config(['I18n', function(I18n) { console.log("common I18n " + I18n) }]); ``` Our usual way to guarantee what I18n is being injected in our unit tests is by doing ``` module(function($provide) { $provide.constant('I18n', <mocks>); }); ``` This works fine for my controllers, but it seems like the config function doesn't look at what's `$provide`d outside of the module. Instead of getting the mocked values, it gets the earlier value defined as part of the module. (Undefined in the case of our tests; in the below plunker, 'foo'.) A working plunker is below (look at the console); does anyone know what I'm doing wrong? http://plnkr.co/edit/utCuGmdRnFRUBKGqk2sD

Original source