Javascript AngularJS:测试外部脚本是否有效加载

Javascript AngularJS:测试外部脚本是否有效加载,javascript,unit-testing,testing,angularjs,Javascript,Unit Testing,Testing,Angularjs,我正在使用一个外部脚本(来自),我正在编写一个AngularJS模块与之交互 我想知道如何才能有效地测试他们的脚本是否加载良好(除了运行真正的应用程序) 我应该写一个结束测试吗 谢谢你的帮助 // Service is a factory service.load = function(apiKey) { // Create an async script element for analytics.js. var script = document.createElement(

我正在使用一个外部脚本(来自),我正在编写一个AngularJS模块与之交互

我想知道如何才能有效地测试他们的脚本是否加载良好(除了运行真正的应用程序)

我应该写一个结束测试吗

谢谢你的帮助

// 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);
};

如果文件留下了一个全局文件,您可以简单地查找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();

}())

AngularJS IRC频道的某个人给我指出了一个Jasmine waitsFor block的工作解决方案:github.com/pivotal/Jasmine/wiki/Asynchronous-specs

以下规格以下规格:

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;
        });
    }));

谢谢丹达维斯。有人给我指出了Jasmine waitsFor block的等效解决方案: