AngularJS更改常数值,传递给单元测试的配置

有没有改变传递给单元测试模块的配置功能的常数值?

我有以下(小提琴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");
    }));
});

JSfiddlehttp://jsfiddle.net/f0nmbv3c/

相关文章

ANGULAR.JS:NG-SELECTANDNG-OPTIONSPS:其实看英文文档比看中...
AngularJS中使用Chart.js制折线图与饼图实例  Chart.js 是...
IE浏览器兼容性后续前言 继续尝试解决IE浏览器兼容性问题,...
Angular实现下拉菜单多选写这篇文章时,引用文章地址如下:h...
在AngularJS应用中集成科大讯飞语音输入功能前言 根据项目...
Angular数据更新不及时问题探讨前言 在修复控制角标正确变...