我正在使用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();
}

最佳答案

监视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()的实际实现。

08-18 13:31