AngularJS + Jasmine Unit Test:如何使 angular.constant 在 angular

AngularJS + Jasmine Unit Test: How to make an angular.constant visible inside the angular.forEach()?

本文关键字:angular 何使 constant Jasmine Unit Test AngularJS      更新时间:2023-09-26

如何使 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);                
           })
       });  
   });

亚力桑德罗