AngularJS + Jasmine Unit Test:如何使 angular.constant 在 angular
AngularJS + Jasmine Unit Test: How to make an angular.constant visible inside the angular.forEach()?
如何使 angular.constant 在 angular.forEach() 中可见?
在下面的示例中,angular.constant 可以在父描述块和子描述块中访问。我试图通过使用哈希和循环来运行测试来优化代码,所以开始使用angularjs.forEach()。但是,看起来,angular.constant在angular.forEach()中是不可见的。知道为什么在angular.forEach()中无法访问常量(而服务是)吗?
describe("utilsService:", function(){
beforeEach(module('utilsService'));
var KiB;
var GiB;
beforeEach(inject(function(_KiB_){
KiB = _KiB_;
}));
beforeEach(inject(function(_GiB_){
GiB = _GiB_;
}));
var utilsService;
beforeEach(inject(function(_utilsService_){
utilsService = _utilsService_;
}));
describe('Constant values', function() {
/* The below test works fine */
it("KiB constant in describe", function(){
console.log("KiB value is " + KiB);
expect(KiB).toEqual(1024);
});
tests = {
'KiB value': {
'INPUTS': {
'CONSTANT': KiB
},
'EXPECTED': {
'VALUE': 1024
}
},
'GiB value': {
'INPUTS': {
'CONSTANT': GiB
},
'EXPECTED': {
'VALUE': 1024 * 1024
}
}
}
angular.forEach(tests, function(t_hash, t_name){
var val = t_hash.INPUTS.CONSTANT;
var exp_val = t_hash.EXPECTED.VALUE;
/* The below test is failing */
it(t_name, function(){
console.log("TC: " + test_api_name + " " + t_name );
expect(val).toEqual(exp_val);
})
});
});
注意:调用服务函数(如下文所示 compareSize())工作正常。
describe('compareSize()', function() {
test_api_name = 'compareSize()';
tests = {
'size1 is greater than size2': {
'INPUTS': {
'SIZE1_UNIT': '2 TB',
'SIZE2_UNIT': '2048 KB'
},
'EXPECTED': {
'RETURN': 1
}
},
'float size1 is greater than int size2': {
'INPUTS': {
'SIZE1_UNIT': '1.50 TB',
'SIZE2_UNIT': '1 TB'
},
'EXPECTED': {
'RETURN': 1
}
}
}
angular.forEach(tests, function(t_hash, t_name){
var size1_unit = t_hash.INPUTS.SIZE1_UNIT;
var size2_unit = t_hash.INPUTS.SIZE2_UNIT;
var exp_ret = t_hash.EXPECTED.RETURN;
it(t_name, function(){
console.log("TC: " + test_api_name + " " + t_name );
var ret = utilsService.compareSize(size1_unit, size2_unit);
expect(ret).toEqual(exp_ret);
})
});
我认为你的问题(问题 1)是在每个 it() 之前调用 beforeEach(),因此,当您定义"测试"时,您"退出"了 it(),而 KiB/Gib 是未定义的。
(您可以使用控制台验证调用顺序.log)
你可以通过将测试的实例化放在 beforeEach() 中来解决这个问题
并将 forEach 循环放入 it() 中。
例:
var KiB;
var GiB;
var tests;
beforeEach(function(inject(_KiB_, _GiB_) ){
console.log("set Kib and Gib");
KiB = _KiB_;
GiB = _GiB_;
console.log("define tests");
tests = tests || {
'KiB value': {
'INPUTS': {
'CONSTANT': KiB
},
'EXPECTED': {
'VALUE': 1024
}
},
'GiB value': {
'INPUTS': {
'CONSTANT': GiB
},
'EXPECTED': {
'VALUE': 1024 * 1024
}
}
}
});
但我想建议你一种不同的方法来测试你的常量:
describe("Constant values:", function(){
it("KiB value should be 1024", function(){
expect(KiB).toEqual(1024);
});
it("GiB value should be 1024*1024", function(){
expect(GiB).toEqual(1024*1024);
});
});
.. 或更准时:
describe("Constant: KiB", function(){
var KiB;
beforeEach(inject(function(_KiB_){
KiB = _KiB_;
}));
it("its value should be 1024", function(){
expect(KiB).toEqual(1024);
});
});
describe("Constant: GiB", function(){
var GiB;
beforeEach(inject(function(_GiB_){
GiB = _GiB_;
}));
it("its value should be 1024*1024", function(){
expect(GiB).toEqual(1024*1024);
});
});
老实说,我认为这些是正确的测试,但是,无论如何,如果/当"问题 1"(从 it() 中定义 KiB/GiB )将被解决时,这就是我做这项工作的方式:
describe("Constants are well defined", function(){
[
{ name: "KiB value should be 1024", value: KiB, expectedValue: 1024 },
{ name: "GiB value should be 1024*1024", value: GiB, expectedValue: 1024*1024 }
]
.forEach(function(test){
it(test.name, function(){
expect(test.value).toEqual(test.expectedValue);
})
});
});
亚力桑德罗
相关文章:
- Angular使服务可以从任何地方访问
- 如何在angular中使构造函数之外的服务可用
- Angular UI网格:如何通过第一个UI网格中的按钮使第二个UI网格可见
- 如何使Angular JS控制器与指令一起工作
- 如何使 Angular 服务中的数据通过页面刷新持久化
- 使 Angular JS 实时 ajax 请求消耗更少
- Angular-使字符串对URL安全-路由是否正确
- 如何使Angular打开一个按钮并关闭另一个按钮
- Angular 2-我如何使我的index.html文件的标题和关键字和描述的元标签是动态的
- 如何使Angular Directive模板包装内容(Directive元素的子元素)
- 使ng-show/ng-hide与由Angular之外的外部源修改的localStorage一起工作
- 剑道网格:如何在与Angular一起使用时从组合框单元格模板中获取所选项目
- 使用Angular UI Router,如何使一个状态成为所有状态的子状态
- Angular 和 Animate.css - 一起使用时不显示正确的信息
- Angular 的控制器方法如何使$scope可用于我的函数参数
- Angular SPA应用程序使其他URL仍然具有基于URL编号的突出显示导航栏部分
- AngularJS + Jasmine Unit Test:如何使 angular.constant 在 angular
- 当变量使用 Angular 更改时,如何使某些内容闪烁
- Angular.js -使函数在其他控制器中可用
- Angular JS - 使服务从控制器和视图全局访问