2

我正在使用 jasmine 2.0 进行测试,我正在监视 jquery ajax 并返回一个承诺。在 done() 函数方法中 displayContent() 没有被调用,但它上面的控制台消息被显示出来。我哪里错了?

测试.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();
})

应用程序.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();
}
4

2 回答 2

2

两个可能的选项出现在我的脑海中:

1) 在某些情况下,您应该在测试代码中调用 $scope.apply() 以确保执行 promise 的 then 函数。

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

it('', function(done){
  $promise.then(function(){
    expect(...);
    done();
  })
});
于 2014-09-01T14:52:47.133 回答
1

监视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.0and.callThrough();中,将委托给displayContent().

于 2014-09-01T11:37:42.723 回答