- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我只使用 Jasmine 和 Karma(测试运行器)在 AngularJS 中进行了少量测试但我现在被困住了。我在局部 View 上集成了谷歌地图,我很想在相应的 Controller 中测试我为它编写的功能(点击发生时放置一个标记,改变 map 上圆的半径,......)
所有功能都可用,但测试它似乎要困难得多。这是我用来验证服务是否已定义的简单测试:
it('should contain a locationDbService',
function () {
expect(locationDbService).toBeDefined();
});
我在每次测试前都执行了以下代码:
var ctrl, scope, locationDbService;
// inject the $controller and $rootScope services
// in the beforeEach block
beforeEach(inject(function ($controller, $rootScope, _LocationDbService_) {
// Create a new scope that's a child of the $rootScope
scope = $rootScope.$new();
// Create the controller
ctrl = $controller('AddLocationCtrl', {
$scope: scope,
LocationDbService: _LocationDbService_
});
locationDbService = _LocationDbService_;
}));
Controller header 如下:
.controller('AddLocationCtrl', function ($scope, LocationDbService) {
在 Controller 中初始化函数:
var map;
$scope.initialize = function () {
var mapOptions = {
zoom: 15,
center: new google.maps.LatLng(51.142036, 4.440966)
};
map = new google.maps.Map(document.getElementById('map-canvas-add-location'), mapOptions);
};
google.maps.event.addDomListener(window, "load", $scope.initialize());
查看:
<div class="item item-body">
<div id="map-canvas-add-location"></div>
</div>
我一开始遇到的问题是:
我通过将 google maps js 文件添加到 Karma conf 文件数组来“修复”它,这是正确的解决方案吗?
当我添加 js 文件并再次运行测试时,出现以下错误:
我已经在网上搜索解决方案好几个小时了,但找不到任何可行的解决方案。我究竟做错了什么?
提前致谢!
最佳答案
对于您的第一个错误屏幕,您是正确的,这是由于 jasmine 测试运行器未包含对 google maps js 文件的引用。
对于第二个错误,您没有带有 map-canvas-add-location 的 div 元素。您的 View 确实包含 div 元素,但它没有被加载到您的 jasmine 测试套件中。这是正确的行为,单元测试不应依赖于特定的 dom 结构,因为这会使它们更加脆弱。
我知道有两种方法可以处理第二个错误:
我推荐第 1 种方法,因为仅进行端到端测试并不是一个可以掉以轻心的步骤。 E2E 测试通常更脆弱且更难维护。
这是一个包装服务的示例:
.factory('GoogleMap', function(){
return {
createMap: function(element, options){
return new google.maps.Map(element, options);
},
mapOptions: {
animation: google.maps.MapTypeId.DROP,
maxZoom: 15,
mapTypeControlOptions: {
position: google.maps.ControlPosition.LEFT_BOTTOM,
style: google.maps.MapTypeControlStyle.DROPDOWN_MENU
}
},
markerOptions:{
animation: google.maps.Animation.DROP,
clickable: true
},
position: function(location){
return new google.maps.LatLng(location.latitude, location.longitude);
},
geocode: function(search, successFun){
var geocoder = new google.maps.Geocoder();
geocoder.geocode(search, successFun);
},
bounds: function(){
return new google.maps.LatLngBounds();
}
};
});
并在代码中使用:
var mapOptions = angular.extend({
zoom: 15,
center: GoogleMap.position({latitude: 51.142036, longitude: 4.440966})
}, GoogleMap.mapOptions);
map = GoogleMap.createMap(document.getElementById('map-canvas-add-location'), mapOptions);
然后在您的测试中,您需要创建一个模拟的 GoogleMap 服务并设置监视该模拟服务以断言您的 map 已正确生成。
这是一个示例模拟 GoogleMap 服务:
.factory('mockGoogleMap', function(){
var mapResult = {
formatted_address: 'mock formatted address',
geometry: {
location: {
lat: function(){
return 1;
},
lng: function(){
return 2;
}
}
}
};
return {
createMap: function(element, options){
return {
//add functions called by your controller on the map here
};
},
mapOptions: {},
markerOptions: {},
position: function(location){
return {latitude: location.latitude, longitude: location.longitude};
},
geocode: function(params, success){
success([mapResult], null);
},
geocodeResult: mapResult,
bounds: function(){
return {
extend: function(position){},
getCenter: function(){ return {}; }
};
},
};
});
关于javascript - AngularJS Jasmine 测试谷歌地图 : offsetWidth is null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22934951/
我在使用 Google map API 显示邮政编码时遇到问题。但是,它给出了一个错误: https://maps.gstatic.com/maps-api-v3/api/js/19/6/main.j
在 element.offsetWidth 中,FF 和 Chrome 之间有 1px 的差异。 我一直在阅读以试图理解这个问题。试图reset the CSS , 试图将元素从屏幕边界附近移开(我记
我有一个 JS 函数可以获取页面上 div 的宽度: function getWidth() { var container = document.getElementsByClassName(
好吧,我正在尝试创建一个水平站点,但是当我尝试获取导航的 offsetWidth 时,它返回的值远高于真实宽度。可以找到有问题的设计 here .该页面的 CSS 是 here和 JS here .
我在跨不同浏览器使用 offsetWidth 时遇到了问题。这种结果差异导致了一些奇怪的布局。我创建了一个非常小的示例来显示我所看到的内容。 jsbin HTML Cell 1
1、概念 它们都是Element的属性,表示元素的宽度: Element.clientWidth 内容+内边距-滚动条-----不包括边框和外边距 =
Element.scrollWidth 只读属性是衡量元素内容的宽度,包括因为溢出而在屏幕上不可见的内容。SO 中的帖子对 scrollWidth、offsetWidth、clientWidth 有详
这段代码是我写的。 当我添加滚动条时,我得到 403 作为 clientWidth,这似乎是真的:403px 用于内部内容 + 17px 用于滚动条。然后我得到 403 作为 offsetWidth,
我正在尝试找到适合我的场景的文本宽度。这是我的代码(简单示例) var text = "Country and some following text"; var textObj = documen
我在使用 jquery 时遇到了一个奇怪的问题。我们正在尝试在我们的 Web 应用程序中使用相当旧的 jQuery 1.5.1。它仅支持 IE,并且始终以怪异模式呈现(无 doctype 元素)。 除
我有一个带有表格的 AngularJS 应用程序,我想获得这个场景: 首先:我想使用 table 引导类创建一个流动的表; 第二:在 table head 中的一些 javascript 更改(重建
我有一个链接的 css 文件用于默认属性,第二个链接文件用于显示窗口更改时它会更改的消息。在 JS 脚本的末尾,我将一个元素的 offsetWidth 放在全局值 NavW 中。所以 JS 似乎返回了
在我的应用程序中,我想检查是否有文本溢出(省略号)。为此,我检查 e.offsetWidth JS function manageReportDescription(
我尝试使用 nativeElement.offsetWidth 获取元素宽度,但它比实际宽度小 2.5px。我想知道我错过了什么? 我试图检查 DOM 并试图找到 2.5px 的位置,但我无法在任何地
不知何故,我在 Firefox 和 Chrome 中得到了不同的 offsetWidth 结果。 我有一个简单的按钮 Dropdown 其中 offsetWidth 正好是 89 像素。 Chrome
我正在尝试根据 div 中包含的图像的宽度调整其大小,但没有任何 JS 方法可以一致地工作来获取图像的宽度。 label here img { width: auto
void element.offsetWidth; 是一行奇怪的代码,它似乎什么也没做,但却是 CSS 动画工作所必需的。这条线有什么作用以及为什么需要它? 如果整行被注释掉,动画会发生一次但不会重复
我需要根据一些标签的宽度和高度来计算 offsetwidth... 我知道如何计算特定标签的 offsetwidth 高度 = 563 像素,宽度 = 763 像素,我使用 有一些内容,p 标签左边
我用 Bootstrap 3.3 创建了一个 carousel 它可以在我的本地机器上运行,但是当我将整个东西上传到正在编译 bootstrap js 文件的服务器上时将其他文件放在一个文件中,我收到
Angular 新手,我正在尝试使用 ScrollTrigger 进行水平滚动。 它有效,但是当我提供或构建时,出现错误: 类型“元素”上不存在属性“偏移宽度”。 这是 gsap 的代码: gsap.
我是一名优秀的程序员,十分优秀!