对象方法的Jasmine测试

时间:2014-10-28 19:15:09

标签: javascript jasmine javascript-objects

您好,我对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对象。我无法找到类似的例子来工作。

1 个答案:

答案 0 :(得分:1)

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

如果您只想测试是否会调用该函数,那么您可以执行以下操作:

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

如果您仍想使用模拟功能,可以执行此操作(使用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.


这是 demo (使用模拟谷歌地理编码器)。


<小时/> 这是您修复代码的方法。问题是:做这样的测试是否合理? 在单元测试中,您应该测试与其他资源分开的代码(例如Google地理编码器)。因此,在这种情况下,最好是模拟地理编码器对象并测试是否使用正确的参数调用了模拟。