Подделка структуры объектов Google Maps с помощью JavaScript для модульных тестов

Объекты API Карт Google используются следующим образом: google.maps."Constructor" кажется.

Я хочу подделать вызовы, перечисленные ниже...

//var map = new google.maps.Map(value);
//var fireStationBound = new google.maps.LatLng(val,val);
//var bounds = new google.maps.LatLngBounds(boundary, boundary);
//var markerFireStation = new google.maps.Marker(val);
//var waterstationLayer = new google.maps.KmlLayer(val);
//map.mapTypes.set();

... с кодом ниже...

 $(document).ready(function() {

   function google() {

     /* todo: Setup for every constructor a test function returning the test data */

     function LatLng(value) {

     }

     function LatLngBounds(value,value) {

     }

     function Marker(value) {

     }

     function Map(value) {

     }

     function KmlLayer(value) {

     }

     var maps = {
                  maps: {
                          LatLng: LatLng,
                          LatLngBounds: LatLngBounds,
                          Marker: Marker,
                          Map: Map,
                          KmlLayer: KmlLayer
                        }
                };
                return maps;
     }

     **// Works**
     var google = new google();    
     var bound = new google.maps.LatLng(10);
     var bounds = new google.maps.LatLngBounds(10,20);
     var marker = new google.maps.Marker(10);
     var layer = new google.maps.KmlLayer(10);
     var map = new google.maps.Map(10);
     **// Doesn't Work **
     map.mapTypes.set();
});

Как я могу подделать этот код Google...

map.mapTypes.set();

... который возвращается вызовом...

var map = google.maps.Map(val);

Как должен выглядеть мой JavaScript, чтобы набрать map.mapTypes.set() и, наконец, вызывается функция set?

Я просто хочу подделать объекты Google, которые я использую в своем коде для модульных тестов.

Ответ 1

Здесь наш заглушка Google Maps для v3.19.18. Это было первоначально написано на CoffeeScript, но я провел его через js2coffee, и здесь была сырая реализация Javascript. Я добавил mapTypes.set() для вас.

window.stubGoogleAPIS = function () {
return window.google = {
    maps: {
        Animation: {},
        BicyclingLayer: function() {},
        Circle: function () {},
        ControlPosition: {},
        Data: function() {},
        DirectionsRenderer: function() {},
        DirectionsService: function() {},
        DirectionsStatus: {},
        DirectionsTravelMode: {},
        DirectionsUnitSystem: {},
        DistanceMatrixElementStatus: {},
        DistanceMatrixService: function() {},
        DistanceMatrixStatus: {},
        ElevationService: function() {},
        ElevationStatus: {},
        FusionTablesLayer: function() {},
        Geocoder: function() {},
        GeocoderLocationType: {},
        GeocoderStatus: {},
        GroundOverlay: function() {},
        ImageMapType: function () {},
        InfoWindow: function() {},
        KmlLayer: function() {},
        KmlLayerStatus: {},
        LatLng: function() {},
        LatLngBounds: function() {},
        MVCArray: function() {},
        MVCObject: function() {},
        Map: function () {
            return {
                setTilt: function () { },
                mapTypes: {
                    set: function () { }
                },
                overlayMapTypes: {
                    insertAt: function () { },
                    removeAt: function () { }
                }
            };
        },
        MapTypeControlStyle: {},
        MapTypeId: {
            HYBRID: '',
            ROADMAP: '',
            SATELLITE: '',
            TERRAIN: ''
        },
        MapTypeRegistry: function() {},
        Marker: function() {},
        MarkerImage: function() {},
        MaxZoomService: function () {
            return {
                getMaxZoomAtLatLng: function () { }
            };
        },
        MaxZoomStatus: {},
        NavigationControlStyle: {},
        OverlayView: function () { },
        Point: function() {},
        Polygon: function() {},
        Polyline: function() {},
        Rectangle: function() {},
        SaveWidget: function() {},
        ScaleControlStyle: {},
        Size: function() {},
        StreetViewCoverageLayer: function() {},
        StreetViewPanorama: function() {},
        StreetViewService: function() {},
        StreetViewStatus: {},
        StrokePosition: {},
        StyledMapType: function() {},
        SymbolPath: {},
        TrafficLayer: function() {},
        TransitLayer: function() {},
        TransitMode: {},
        TransitRoutePreference: {},
        TravelMode: {},
        UnitSystem: {},
        ZoomControlStyle: {},
        __gjsload__: function () { },
        event: {
            addListener: function () { }
        },
        places: {
            AutocompleteService: function () {
                return {
                    getPlacePredictions: function () { }
                };
            }
        }
    }
};

Ответ 2

Здесь находится заглушка для Карт Google v3.23, которая является версией на момент написания. Этот API часто обновляется, поэтому я включил ссылки на каждый соответствующий раздел справочного API: если требуются какие-либо обновления, их легко найти:

window.stubGoogleAPIS = function () {
return window.google = {
maps: {
    //https://developers.google.com/maps/documentation/javascript/reference#Animation
    Animation: {},
    //https://developers.google.com/maps/documentation/javascript/reference#Attribution
    Attribution: {},
    //https://developers.google.com/maps/documentation/javascript/reference#BicyclingLayer
    BicyclingLayer: function () { },
    Circle: function () { },
    //https://developers.google.com/maps/documentation/javascript/reference#ControlPosition
    ControlPosition: {},
    //https://developers.google.com/maps/documentation/javascript/reference#Data
    Data: function () { },
    //https://developers.google.com/maps/documentation/javascript/reference#DirectionsRenderer
    DirectionsRenderer: function () { },
    //https://developers.google.com/maps/documentation/javascript/reference#DirectionsService
    DirectionsService: function () { },
    //https://developers.google.com/maps/documentation/javascript/reference#DirectionsStatus
    DirectionsStatus: {},
    //https://developers.google.com/maps/documentation/javascript/reference#DistanceMatrixElementStatus
    DistanceMatrixElementStatus: {},
    //https://developers.google.com/maps/documentation/javascript/reference#DistanceMatrixService
    DistanceMatrixService: function () { },
    //https://developers.google.com/maps/documentation/javascript/reference#DistanceMatrixStatus
    DistanceMatrixStatus: {},
    //https://developers.google.com/maps/documentation/javascript/reference#ElevationService
    ElevationService: function () { },
    //https://developers.google.com/maps/documentation/javascript/reference#ElevationStatus
    ElevationStatus: {},
    //https://developers.google.com/maps/documentation/javascript/reference#FusionTablesLayer
    FusionTablesLayer: function () { },
    //https://developers.google.com/maps/documentation/javascript/reference#Geocoder
    Geocoder: function () { },
    //https://developers.google.com/maps/documentation/javascript/reference#GeocoderLocationType
    GeocoderLocationType: {},
    //https://developers.google.com/maps/documentation/javascript/reference#GeocoderStatus
    GeocoderStatus: {},
    //https://developers.google.com/maps/documentation/javascript/reference#GroundOverlay
    GroundOverlay: function () { },
    //https://developers.google.com/maps/documentation/javascript/reference#ImageMapType
    ImageMapType: function () { },
    InfoWindow: function () { },
    //https://developers.google.com/maps/documentation/javascript/reference#KmlLayer
    KmlLayer: function () { },
    //https://developers.google.com/maps/documentation/javascript/reference#KmlLayerStatus
    KmlLayerStatus: {},
    //https://developers.google.com/maps/documentation/javascript/reference#LatLng
    LatLng: function () { },
    //https://developers.google.com/maps/documentation/javascript/reference#LatLngBounds
    LatLngBounds: function () { },
    //https://developers.google.com/maps/documentation/javascript/reference#MVCArray
    MVCArray: function () { },
    //https://developers.google.com/maps/documentation/javascript/reference#MVCObject
    MVCObject: function () { },
    //https://developers.google.com/maps/documentation/javascript/reference#Map
    Map: function () {
        return {
            //methods
            fitBounds: function () { },
            getBounds: function () { },
            getCenter: function () { },
            getDiv: function () { },
            getHeading: function () { },
            getMapTypeId: function () { },
            getProjection: function () { },
            getStreetView: function () { },
            getTilt: function () { },
            getZoom: function () { },
            panBy: function () { },
            panTo: function () { },
            panToBounds: function () { },
            setCenter: function () { },
            setHeading: function() { },
            setMapTypeId: function() { },
            setOptions: function() { },
            setStreetView: function () { },
            setTilt: function () { },
            setZoom: function() { },
            //properties
            controls: {},
            data: {
                //https://developers.google.com/maps/documentation/javascript/reference#Data
                //methods
                add: function () { },
                addGeoJson: function () { },
                contains: function () { },
                forEach: function () { },
                getControlPosition: function () { },
                getControls: function () { },
                getDrawingMode: function () { },
                getFeatureById: function () { },
                getMap: function () { },
                getStyle: function () { },
                loadGeoJson: function () { },
                overrideStyle: function () { },
                remove: function () { },
                revertStyle: function () { },
                setControlPosition: function () { },
                setControls: function () { },
                setDrawingMode: function () { },
                setMap: function () { },
                setStyle: function () { },
                toGeoJson: function () { },
                //properties
                controlPosition: {},
                controls: [],

            },
            mapTypes: {
                //https://developers.google.com/maps/documentation/javascript/reference#MapTypeRegistry
                //methods
                set: function () { }
            },
            overlayMapTypes: {
                //https://developers.google.com/maps/documentation/javascript/reference#MVCArray
                clear: function () { },
                getArray: function () { },
                getAt: function () { },
                getLength: function () { },
                insertAt: function () { },
                pop: function () { },
                push: function () { },
                removeAt: function () { },
                setAt: function () { }
            }
        };
    },
    MapTypeControlStyle: {},
    //https://developers.google.com/maps/documentation/javascript/reference#MapTypeId
    MapTypeId: {
        HYBRID: '',
        ROADMAP: '',
        SATELLITE: '',
        TERRAIN: ''
    },
    //https://developers.google.com/maps/documentation/javascript/reference#MapTypeRegistry
    MapTypeRegistry: function () { },
    //https://developers.google.com/maps/documentation/javascript/reference#Marker
    Marker: function () {
        return {
            setTitle: function (visible) { },
            setVisible: function () { },
            setZIndex: function () { }
        }
    },
    MarkerImage: function () { },
    //https://developers.google.com/maps/documentation/javascript/reference#MarkerOptions
    MarkerOptions: {
        visible: false
    },
    //https://developers.google.com/maps/documentation/javascript/reference#MaxZoomService
    MaxZoomService: function () {
        return {
            getMaxZoomAtLatLng: function () { }
        };
    },
    //https://developers.google.com/maps/documentation/javascript/reference#MaxZoomStatus
    MaxZoomStatus: {},
    NavigationControlStyle: {},
    OverlayView: function () { },
    //https://developers.google.com/maps/documentation/javascript/reference#Point
    Point: function () { },
    //https://developers.google.com/maps/documentation/javascript/reference#Polygon
    Polygon: function () { },
    //https://developers.google.com/maps/documentation/javascript/reference#Polyline
    Polyline: function () { },
    //https://developers.google.com/maps/documentation/javascript/reference#Rectangle
    Rectangle: function () { },
    //https://developers.google.com/maps/documentation/javascript/reference#SaveWidget
    SaveWidget: function () { },
    //https://developers.google.com/maps/documentation/javascript/reference#ScaleControlStyle
    ScaleControlStyle: {},
    //https://developers.google.com/maps/documentation/javascript/reference#Size
    Size: function (width, height, wiidthUnit, heightUnit) { },
    //https://developers.google.com/maps/documentation/javascript/reference#StreetViewCoverageLayer
    StreetViewCoverageLayer: function () { },
    //https://developers.google.com/maps/documentation/javascript/reference#StreetViewPanorama
    StreetViewPanorama: function () { },
    //https://developers.google.com/maps/documentation/javascript/reference#StreetViewService
    StreetViewService: function () { },
    //https://developers.google.com/maps/documentation/javascript/reference#StreetViewStatus
    StreetViewStatus: {},
    //https://developers.google.com/maps/documentation/javascript/reference#StrokePosition
    StrokePosition: {},
    //https://developers.google.com/maps/documentation/javascript/reference#StyledMapType
    StyledMapType: function () { },
    //https://developers.google.com/maps/documentation/javascript/reference#SymbolPath
    SymbolPath: {},
    //https://developers.google.com/maps/documentation/javascript/reference#TrafficLayer
    TrafficLayer: function () { },
    //https://developers.google.com/maps/documentation/javascript/reference#TransitLayer
    TransitLayer: function () { },
    //https://developers.google.com/maps/documentation/javascript/reference#TransitMode
    TransitMode: {},
    //https://developers.google.com/maps/documentation/javascript/reference#TransitRoutePreference
    TransitRoutePreference: {},
    //https://developers.google.com/maps/documentation/javascript/reference#TravelMode
    TravelMode: {},
    //https://developers.google.com/maps/documentation/javascript/reference#UnitSystem
    UnitSystem: {},
    //https://developers.google.com/maps/documentation/javascript/reference#ZoomControlStyle
    ZoomControlStyle: {},
    __gjsload__: function () { },
    event: {
        addListener: function () { }
    },
    places: {
        AutocompleteService: function () {
            return {
                getPlacePredictions: function () { }
            };
        }
    }
}
};