有没有改变传递给单元测试模块的配置功能的常数值?
我有以下(小提琴here):
//--- CODE -------------------------- var module = angular.module("myApp",[]); module.constant("myConstant","foo"); module.provider("awesomeStuff",function () { var value; this.setValue = function (val) { value = val; }; this.$get = function () { return { myValue: value }; }; }); module.config(function (myConstant,awesomeStuffProvider) { //want to mock myConstant awesomeStuffProvider.setValue(myConstant); }); //--- SPECS ------------------------- describe("foo",function() { beforeEach(angular.mock.module("myApp",function ($provide) { //Attempt to override the myConstant value that gets passed to config $provide.constant("myConstant","bar"); })); it("has a value of bar",inject(function(awesomeStuff,$injector) { expect($injector.get("myConstant")).toBe("bar"); expect(awesomeStuff.myValue).toBe("bar"); })); });
我知道这是一个微不足道的例子,但我想知道是否可能得到一个不同的常量注入到配置…我知道有可能获得提供者的引用并调用setValue函数从单元测试(即通过this SO post配置提供商),但这不是我正在寻找的.
感谢任何帮助.
考虑以下几点:
beforeEach(angular.mock.module("myApp"));
在你的情况下你有:
beforeEach(angular.mock.module("myApp",function ($provide) { //Attempt to override the myConstant value that gets passed to config $provide.constant("myConstant","bar"); }));
现在发生的情况基本上与以下情况相同:
var module = angular.module("myApp",[]); ... Constant and Provider omitted ... module.config(function(myConstant,awesomeStuffProvider) { awesomeStuffProvider.setValue(myConstant); }); module.config(function($provide) { $provide.constant("myConstant","bar"); });
如果您需要在使用任何配置函数之前模拟一个常量,我建议将其放在单独的模块中.
根据您的用例,您现在可以:
>创建此模块的两个版本 – 一个用于生产,另一个用于测试
>只创建真实版本,并在测试中模拟常量
第二种情况看起来像这样:
应用程序:
angular.module("configuration",[]).constant("myConstant","foo"); var module = angular.module("myApp",["configuration"]); module.provider("awesomeStuff",function () { var value; this.setValue = function (val) { value = val; }; this.$get = function () { return { myValue: value }; }; }); module.config(function (myConstant,awesomeStuffProvider) { awesomeStuffProvider.setValue(myConstant); });
测试:
describe("foo",function () { beforeEach(function () { angular.mock.module("configuration",function ($provide) { $provide.constant("myConstant","bar"); }); angular.mock.module("myApp",function () { // Something else }); }); it("has a value of bar",inject(function (awesomeStuff,$injector) { expect($injector.get("myConstant")).toBe("bar"); expect(awesomeStuff.myValue).toBe("bar"); })); });
JSFiddle:http://jsfiddle.net/f0nmbv3c/