覆盖存根的功能

时间:2014-02-28 13:46:19

标签: javascript angularjs angularjs-directive karma-runner sinon

我想测试我的谷歌地图地理编码器指令。在那里,我有一个我已经存根的地理编码构造函数:

...
link: function(scope) {
    var map,
        geocoder,
        myLatLng,
        mapOptions = {
            zoom: 1,
            mapTypeId: google.maps.MapTypeId.ROADMAP
        };

    geocoder = new google.maps.Geocoder();
    map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);

    geocoder.geocode({'address': 'New York'}, function(results, status) {
        myLatLng = new google.maps.LatLng(results[0].geometry.location.lat(),
            results[0].geometry.location.lng());
    }});
}

我的存根码:

MapsGeocoderStub = sinon.stub();
$window.google = {
    maps: {
        Geocoder: MapsGeocoderStub
    }
};

我想测试geocode.geocoder()是否已被调用。因此,我认为我需要告诉存根它有这个方法,它通常由构造函数google.maps.Geocoder()创建。

无论如何都是正确的方法吗?

1 个答案:

答案 0 :(得分:1)

你可以参加考试:

var geocodeInstance = {
    geocode: sinon.spy()
};

$window.google = {
    maps: {
        Geocoder: sinon.stub().returns(geocodeInstance);
    }
};

所以在这里你说你的新$ window.google.maps.Geocoder()返回geocodeInstance,它有一个方法地理编码。我也使用sinon.spy(),因为你只想测试它被调用。它也可以是一个存根。

后来:

expect(geocodeInstance.geocode).calledOnce;

我用过期待,因为这是我用来编写测试的方式。 也可以尝试更改你的指令并注入$ window并执行:

geocoder = new $window.google.maps.Geocoder();