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