2012-03-29 122 views
0

我想测试一个非常简单的jQuery插件,它只需调用$ .ajax方法并将其内容放入元素中。为了测试,我正在使用JsTestDriver和Sinon进行嘲讽。jQuery的Ajax测试不起作用

插件文件如下:

(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文本。

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

+0

console.log($(this));将引用ajax对象 - 而不是元素传递给插件 – mikevoermans 2012-03-29 18:37:35

+0

你正在混合json dataType与字符串在测试中,很难按照你想要的 – charlietfl 2012-03-29 18:55:39

回答

0

使用同步AJAX

JS测试驱动程序,大多数测试框架,我知道有一点问题的处理异步JavaScript中,基本上异步的脱节性质要求搞砸了测试执行的顺序(认为:测试2在测试1完成之前开始执行)。出于这个原因,请尝试使用synchornous ajax调用您的测试期间,方法是使用jQuery.ajaxSetup()设置全局异步属性。

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

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

// Revert to default 
jQuery.ajaxSetup({async: true}); 
+0

我不同意。 js-test-driver支持测试异步函数。这不是我所说的简单,但它是可能的和可以理解的。据我了解,线程所有者没有遇到多个测试用例不同步的问题,但为使用异步行为的方法编写了一个测试用例。 – Friederike 2013-04-19 09:45:45

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

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