用茉莉花做一个真正的ajax调用

时间:2015-08-26 14:21:22

标签: javascript ajax jasmine

我想将Jasmine用于两件事,测试一个执行真正的ajax调用的函数,并从ajax调用中获取回调数据,以便在其他茉莉花测试中使用。

这是我到目前为止所做的:

Javascript功能:

function getAttributeInfo(selectedLayer){

    // Get layer attributes
    $.ajax({
        type: 'get',
        url: '/geoserver/oqplatform/ows?service=WFS&version=1.0.0&request=GetFeature&typeName='+ selectedLayer +'&outputFormat=json',
        success: function(data) {
            // pass the data into a global variable
            foo = data;
            // EDIT
            return data;
        }
    });
}

测试:

it("an ajax test", function() {

    var ajaxFunction = getAttributeInfo(SVIRLayerNames[0]);
    // creating spied callback
    var callback = jasmine.createSpy('callback');

    spyOn($, 'ajax').and.callFake(function (req) {
        var d = $.Deferred();
        return d.promise();
    });

    // EDIT
    //ajaxFunction.fetch(callback);
    ajaxFunction(callback);

    // everything after this does not seem to execute
    var fakeData = callback.calls.mostRecent().args[0];
});

如果我在5秒后控制台记录foo变量,我可以看到ajax请求已经发出并且数据在foo变量中可用

1 个答案:

答案 0 :(得分:1)

经过几天的研究,我最大的收获是Jasmine是一个很棒的工具,但文档很糟糕。我发现很难简单地理解间谍是什么以及什么时候应该使用它。

我的解决方案是根本不使用间谍。

beforeAll(function(done) {

    var mySyncFunction = function () {

        var layerName = 'foobar';
        var layerRequest = getAttributeInfo(layerName);

        layerRequest.success(function(layerResponse) {
            // Pass data from the response into a global variable to be tests
            // I can also check for things like the API version number.
        });

        layerRequest.done(function() {
           // Alert Jasmine that the AJAX call is done
           done();
        });
    };

    mySyncFunction();
}

在getAttributeInfo函数中,我在return之前添加了$.ajax

<强>更新

...
beforeAll(function(done) {
    $.ajax({
        url: '/my/data',
        data: {},
        success: function (response) {
            foo = response
            done();
        },
    dataType: 'html'
    });
});

////////////////
// Some tests //
////////////////

it("meets some requirement", function() {
    for (var i = 0; i < foo.length; i++) {
        var name = foo[i].fields.name;
        expect(name).toBeDefined();
    }
});