2016-09-23 42 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()之前注入服務。 –