2013-05-07 35 views
1

我正在使用外部腳本(來自http://segment.io),並且正在寫一個AngularJS模塊來與它進行交互。AngularJS:測試外部腳本是否有效加載

我想知道如何有效地測試他們的腳本是否裝載得很好(除了運行真正的應用程序)。

我應該寫一個end2end測試嗎?

感謝您的幫助!

// Service is a factory 
service.load = function(apiKey) { 
    // Create an async script element for analytics.js. 
    var script = document.createElement('script'); 
    script.type = 'text/javascript'; 
    script.async = true; 
    script.src = ('https:' === document.location.protocol ? 'https://' : 'http://') + 
     'd2dq2ahtl5zl1z.cloudfront.net/analytics.js/v1/' + apiKey + '/analytics.js'; 

    // Find the first script element on the page and insert our script next to it. 
    var firstScript = document.getElementsByTagName('script')[0]; 
    firstScript.parentNode.insertBefore(script, firstScript); 
}; 

回答

1

如果文件留下一個全球性的,你可以簡單地尋找window.whatever,看看它的加載。

我使用的一個非常靈活的跨瀏覽器模式就是我稱之爲sentinal。在執行自定義代碼之前,您使用包裝函數來等待依賴關係到達。

例如,如果我是動態注入jQuery的進入頁面,我知道這是需要別的動態:

(function waiter(){ 
    if(!window.jQuery){ return setTimeout(waiter, 37); } 

    $("#myDiv").fadeOut(); 

}()) 

這種模式獨立運行任何腳本加載器或瀏覽器特定的事件,以及不需要修改依賴文件,非常適合等待CDN庫的副本。

可以輕鬆程度的概念運用現代陣列的方法,以等待幾個依賴關係:

(function waiter(){ 
    if(![ 
     window.jQuery,   // core 
     window.jQuery.fn.effect, // jq ui 
     window.jQuery.fn.whizBang // jq ui plugin 

    ].every(Boolean)){ return setTimeout(waiter, 37); } 

    $("#myDiv").whizBang(); 

}()) 
+0

感謝dandavis。有人指出我與Jasmine waitsFor block有同等的解決方案:https://github.com/pivotal/jasmine/wiki/Asynchronous-specs – 2013-05-07 18:12:58

0

在AngularJS IRC頻道有人指出我與茉莉花waitsFor塊一個有效的解決方案:github.com/pivotal/jasmine /維基/異步規格

下面一個規範以下規範:

it('should load the API when called with api key', inject(function ($window, segmentio) { 
     segmentio.load(apiKey); 

     waitsFor(function() { 
      return $window.analytics.initialized == true; 
     }, "Segmentio never loaded", 10000); 

     runs(function() { 
      expect($window.analytics).toBeDefined(); 
      expect($window.analytics.initialized).toBeTruthy(); 
      // Unload 
      $window.analytics = null; 
     }); 
    }));