Javascript AngularJS:测试外部脚本是否有效加载
我正在使用一个外部脚本(来自),我正在编写一个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(
// 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的等效解决方案: