4

鉴于此代码:

showForm = function (url) {
        return $.get(url, function (html) {
             $('body').append();              
        });
 };

使用sinon.js,jQuery.mockjax.jsexpect.js时,我有以下通过测试:

it("showForm calls jQuery.append", function () {

    $.mockjax({
          url: '/fake'                    
    });

    var spy = sinon.spy($.fn, "append");             
    presenter.showForm('/fake');

    setTimeout(function () { 
        expect(spy.called).to.be.equal(true);
    }, 1000);
});

使用该setTimeout函数等待来自异步的回调$.get很糟糕,如果我做的太多,它会减慢我的测试套件的速度。

但是,我觉得意图是相当明确的,它似乎确实测试了我想要的东西。

有没有更好的方法,你能解释一下你的答案是怎么回事吗?

4

3 回答 3

3

传递您的匿名函数以将表单显示为参数,并在追加后在回调中调用它。为确保它被调用,您可以将其设为一个涵盖错误回调的 $.ajax 请求。

这样,它会在 get 请求结束且没有多余时间或过早调用时准确调用。

showForm = function (url, callback) {
        return $.get(url, function (html) {
             $('body').append();   
             if(callback != undefined)
             callback();
        });
 };

it("showForm calls jQuery.append", function () {

    $.mockjax({
          url: '/fake'                    
    });

    var spy = sinon.spy($.fn, "append");

    presenter.showForm('/fake', function (){ 
        expect(spy.called).to.be.equal(true);
    });
});
于 2013-07-22T12:47:08.337 回答
1

你应该使用 sinons fakeServer。这将在调用时立即调用您的 ajax 回调$.ajax。看到这个jsFiddle

before(function(){
  var server = sinon.fakeServer.create();
  server.respondWith('response');
})

it("showForm calls jQuery.append", function () {
    var spy = sinon.spy($.fn, "append");             
    presenter.showForm('/fake');
    server.respond();
    expect(spy.called).to.be.equal(true);
});
于 2013-07-22T12:49:16.157 回答
-1

使用 $.doTimeout 插件

检查以下文档。

http://benalman.com/projects/jquery-dotimeout-plugin/

希望这可以帮助

于 2013-07-22T12:47:16.267 回答