在jasmine测试代码中未调用回调函数

Callback function not get called in jasmine test code

本文关键字:调用 回调 函数 jasmine 测试 代码      更新时间:2023-09-26

我正在使用jasmine 2.0进行测试,我正在监视jquery ajax并返回一个promise。在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

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) 在某些情况下,您应该在测试代码中调用$scope.apply(),以确保promise的then函数得到执行。

2) 您可以使用done()函数,如下所示:

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

监视displayContent()并检查是否调用了它。我修改了你的测试,调用了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();
});

在Jasmine 2.0中,and.callThrough();将委托给displayContent()的实际实现。