gpt4 book ai didi

AngularJS 更改传递给配置进行单元测试的常量值

转载 作者:行者123 更新时间:2023-12-02 19:50:40 25 4
gpt4 key购买 nike

是否有办法更改发送到模块配置函数以进行单元测试的常量值?

我有以下内容( fiddle 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");
}));
});

我知道这是一个简单的示例,但我想知道是否可以将不同的常量注入(inject)到配置中...我知道可以获取对提供程序的引用并从中调用 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");
});

由于注册的配置函数将按照注册顺序执行,因此不会达到预期的结果。

如果您需要在任何配置函数中使用常量之前对其进行模拟,我建议将其放入单独的模块中。

根据您的用例,您现在可以:

  1. 创建此模块的两个版本 - 一个用于生产,一个用于测试
  2. 仅创建真实版本并在测试中模拟常量

第二种情况看起来像这样:

应用程序:

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/

关于AngularJS 更改传递给配置进行单元测试的常量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25295445/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com