微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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/

原文地址:https://www.jb51.cc/angularjs/142662.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐