0

我正在尝试测试一个非常简单的 jQuery 插件,它只需调用 $.ajax 方法并将其内容放入元素中。对于测试,我使用 JsTestDriver 和 Sinon 进行模拟。

插件文件看起来:

(function($) {
    $.fn.transfer = function() {

    $.ajax({
        url : 'friends',
    type : 'GET',
    contentType : 'application/json',
    dataType : 'json',
    success : function(html) {
        console.log("-"+html+"-");
        console.log($(this));
        $(this).html(html);
        console.log("+"+$(this).html()+"+")
    }
});
};
})(jQuery);

理论上很简单的插件。

然后我写了一个单元测试模拟成功函数:

TestCase("Ajax ", {
    'test response' : function () {
        /*:DOC divElement = <div id="container" style="height: 100px;"></div>*/
        sinon.stub(jQuery, "ajax").yieldsTo(
            "success", 'alex');
        $(this.divElement).transfer();
        console.log("*"+$(this.divElement).text()+"*");
    }
});

它似乎也正确。然后,如果您执行此测试,将通过控制台打印下一行:

[LOG] -alex-

[LOG] [object Object]

[LOG] +null+

[LOG] **

所以成功函数正确接收“alex”字符串。然后打印 $(this) 引用,使用 html() 函数设置消息,当我记录以前的设置值时,返回 null。最后一条日志消息在测试文件中,您可以在其中看到未设置 ajax 文本。

有人知道我做错了什么吗?因为我确信我错过了一些现在我看不到的东西。

4

2 回答 2

0

使用同步 AJAX

JS 测试驱动程序和我所知道的大多数测试框架在处理异步 javascript 时都存在一些问题,基本上异步调用的脱节性质搞砸了测试执行的顺序(想想:测试 2 在测试 1 完成之前开始执行)。出于这个原因,通过使用jQuery.ajaxSetup()设置全局异步属性,尝试在测试期间使用同步 ajax 调用。

// Use synchronous AJAX
jQuery.ajaxSetup({async: false});

TestCase("Ajax ", {
    'test1' : function () {
        // etc...
    }
});

// Revert to default
jQuery.ajaxSetup({async: true});
于 2012-05-10T23:39:17.663 回答
0

我推荐你使用js-test-driver 提供的AsyncTestCase 。它很好地处理异步进程。

将模拟的服务器方法添加到队列中的回调中,以便测试等到调用“服务器”。像这样的东西:

var AjaxTest = AsyncTestCase('AjaxTest');

AjaxTest.prototype.testResponse = function(queue) {
    /*:DOC divElement = <div id="container" style="height: 100px;"></div>*/

    queue.call('Set up mocked server', function(callbacks) {        
        var serverStub = sinon.stub(jQuery, "ajax").yieldsTo("success", 'alex');
        callbacks.add(serverStub);

        $(this.divElement).transfer();
    });

    queue.call('Make assertions here', function() {
        console.log("*"+$(this.divElement).text()+"*");
    });
};

注意:我没有尝试过代码。希望没有错别字。;)

于 2013-04-19T09:43:57.050 回答