2014-09-01 52 views
2

我正在使用jasmine 2.0进行测试,并且我正在监听jquery ajax并返回一个承诺。 在done()函数方法中,displayContent()不会被调用,但其上方的控制台消息会显示出来。我哪里错了?回调函数不会在茉莉花测试代码中调用

test.js

it(..., function() { 
    var data = {"name" : "John Doe"}; 
    spyOn($, 'ajax').and.callFake(function (req) { 
    var d = $.Deferred(); 
    d.resolve(data); 
    return d.promise(); 
    }); 

    app.doSomething(); 
    expect(app.doSomething).toHaveBeenCalled(); 
}) 

app.js在displayContent()

app.getData = function() { 
    var jsonData = app.loadEmpData(); //gets replaced by spy and returns resolve(data); 
    jsonData.done(function(data) { 
     console.log("shows up in the console"); 
     app.displayContent(data); // doesn't get called 
    }); 
    jsonData.fail(function(){ 
     console.log("error loading data"); 
    }); 
} 

app.loadEmpData = function() { 
    return $.getJSON("/employee.json"); 
} 

app.displayContent = function() { 
    console.log("some content"); 
} 

app.doSomething = function() { 
    app.getData(); 
} 

回答

1

间谍,并检查是否它被称为与否。 我修改了你的测试并调用displayContent()。 用此代码替换并检查。

it("some test", function() { 
    var data = {"name" : "John Doe"}; 
    spyOn($, 'ajax').and.callFake(function (req) { 
     var d = $.Deferred(); 
     d.resolve(data); 
     return d.promise(); 
    }); 
    spyOn(app, 'displayContent').and.callThrough(); 
    app.getData(); 
    expect(app.displayContent).toHaveBeenCalled(); 
}); 

在茉莉花2.0 and.callThrough();将委托给实际执行的displayContent()

2

两个可能的选择在我的头上弹出:

1)在某些情况下,你应该在你的测试代码scope.apply调用$(),以确保在执行承诺的那么函数。

2)你可以用做()函数,就像这样:

it('', function(done){ 
    $promise.then(function(){ 
    expect(...); 
    done(); 
    }) 
});