Jasmine测试对象方法

Jasmine test for object methods

本文关键字:方法 对象 测试 Jasmine      更新时间:2023-09-26

你好,我对Javascript和jasmine有点缺乏经验,正在尝试为Javascript对象编写一些简单的测试。

var googleMap = {
    geoCode: function(code, fn) {
        var geocoder = new google.maps.Geocoder();
        geocoder.geocode({
            'address': code
        }, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                fn(results[0].geometry.location);
            } else {
                alert("ALL IS LOST");
            }
        })
    },
    render: function(LatLng) {
        var mapOptions = {
            zoom: 8,
            center: LatLng
        }
        map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);
        var marker = new google.maps.Marker({
            map: map,
            position: LatLng
        });
    }
};

-这是我的茉莉花剧本;我试图确保无论何时运行地理编码函数,都会调用render函数。。。

describe("Testing of googleMap.js", function() {
    it("Test GeoCode", function() {
        var input = "Columbus";
        spyOn(googleMap, 'render');
        googleMap.geoCode(input, googleMap.render);
        expect(googleMap.render).toHaveBeenCalled();
    });
});

每当我运行这个时,我的specRunner都会返回一个错误,声称已经调用了预期的间谍渲染,我有点困惑,为什么它不会。。。。这是因为我试图设置我的间谍,还是因为我无法测试javascript对象。我很难找到类似的例子。

对象google.maps.Geocoder的方法.geocode异步
因此,在检查回调函数是否执行时,您还没有得到响应,这意味着您的函数将不会被调用。

如果你只想测试函数是否会被调用,那么你可以做如下操作:

describe("Testing of googleMap.js", function() {
    it("Test GeoCode", function(done) {
        var input = "Columbus";
        googleMap.geoCode(input, function() {
            // here you know that your callback function was called
            done();
        });
    });
});

或者如果你仍然想使用mock函数,你可以这样做(使用jasmine 2.0):

describe("Testing of googleMap.js", function() {
    it("Test GeoCode", function(done) {
        var input = "Columbus";
        var callbackSpy = jasmine.createSpy("callback").and.callFake(function() {
            done();
        });
        googleMap.geoCode(input, callbackSpy);
    });
});


对于给定的代码块,如果没有调用回调函数,则会出现超时错误:

Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.


这是一个演示(带有一个模拟的谷歌地理编码器)。



这就是修复代码的方法。问题是:做这样的测试合理吗
在单元测试中,您应该测试与其他资源分离的代码(如谷歌地理编码器)。因此,在这种情况下,imho最好模拟地理编码器对象,并测试是否使用正确的参数调用了mock。