2016-09-23 89 views
0

这个问题不是关于包括服务测试或提供替代服务的模拟。注入公用事业服务给茉莉花测试

现状:

我想测试是有关分析一组属性,并通过getter函数提供该信息的工厂。下面的伪代码描述了现在是正确的发生(supprisingly它的工作原理,但它是相当哈克动态创建测试根据数据长度)。

... 
describe('fancyTest', function() { 
    // 1 
    beforeEach(function() { 
     // 7 
     module('app'); 

     inject(function($injector) { 
      // 8 
      Factory = $injector.get('app.ToTestFactory'); 
      UtilService = $injector.get('app.Util'); // bad, as to late... 
     }); 
    }); 
    // 2 
    describe('dataTest', function() { 
     // 3 
     // Goal: data = UtilService.getData('dataset1'); 
     data = [{id:'test1'}, {id:'test2'}]; 
     for (i = 0, l = data.length; i < l; i += 1) { 
      test(data[i]); 
     } 

     function test(properties) { 
      // 4 
      describe('datatest #' + i, function() { 
       var elem; 
       // 5 
       beforeEach(function() { 
        // 9 
        elem = new Factory(properties) 
       }); 
       // 6 
       it('should provide the correct id', function() { 
        // 10 
        expect(elem.id()).toBe(properties.id); 
       }); 

       ... 
      }); 
     } 
    } 
... 
} 

的UtilService.getData()是一个简单的方法来读取数据超出了执行测试时仅注入的一些常量。这可能很重要,我不希望异步加载它们。

问题:

茉莉花框架有一个相当uninituitive工作流程和第一次运行和初始化所有描述块,它贯穿于beforeEach之前。该订单写在评论中。

在数据循环运行之前,我没有机会注入UtilService吗?

感谢您的帮助!

回答

1

如果您UtilService是一个工厂,你可以与之前各

beforeEach(function() { 
    module('app'); 

    var UtilService; 

    inject(function(_UtilService_) { 

     UtilService = _UtilService_; 

    }); 
}); 

的方式茉莉花设置测试注射服务到每一个测试,只要你在噶正确加载所有的依赖配置,你不应该使用$注入器来提供服务。

而且由于下划线可能有点令人困惑,角将提供下划线服务,因此您可以每次创建一个新实例。

+0

这只是另一种如何编写服务注入的方法。这并不影响茉莉花的执行顺序。注入仍然以#8执行,因此在#3之后,我需要使用Util-Service。有没有办法在Karma配置中预定义Util服务?或者你的意思是指定必要的* .js文件的文件列表?问题不在于正确注入服务,而是在beforeEach()之前注入服务。 –