Javascript 测试回调方法';Jasmine中的s功能

Javascript 测试回调方法';Jasmine中的s功能,javascript,jasmine,Javascript,Jasmine,我有如下服务 InvService(...){ this.getROItems = function(cb){ $http.get('url').success(cb); } } 使用上述功能的控制器之一: var roItems = []; InvService.getROItems(function(res){ roItems = res.lts.items; }); 在Jasmine中,我想测试roitem是否被分配了响应中的值。如何实现这一点

我有如下服务

InvService(...){
  this.getROItems = function(cb){
    $http.get('url').success(cb);  
  }  
}
使用上述功能的控制器之一:

var roItems = [];  
InvService.getROItems(function(res){   
  roItems = res.lts.items;  
});

在Jasmine中,我想测试
roitem
是否被分配了响应中的值。如何实现这一点?

我建议您对服务和控制器分别进行测试。如果要测试分配的
roItems
,需要测试控制器。然后,您可以模拟您的服务,因为它与控制器测试无关,并让它返回您想要的任何内容。你需要这样的东西:

describe('my awesome test', function() {

  it('my awesome test block',                           
       inject(function(InvService, $controller) {
              //This mocks your service with a fake implementation.
              //Note that I mocked before the controller initialization.
              spyOn(InvService, 'getROItems').and.callFake(function(cb){
                  var resultFake = {
                       lts: {
                           items: "whatever you want"
                       }
                  } 
                  cb(resultFake);
              });
              //This initializes your controller and it will use the mocked 
              //implementation of your service
              var myController = $controller("myControllerName");

              //Here we make the assertio
              expect(myController.roItems).toBe("whatever you want");
       }
  )
});

我建议您对您的服务和控制器分别进行测试。如果要测试分配的
roItems
,需要测试控制器。然后,您可以模拟您的服务,因为它与控制器测试无关,并让它返回您想要的任何内容。你需要这样的东西:

describe('my awesome test', function() {

  it('my awesome test block',                           
       inject(function(InvService, $controller) {
              //This mocks your service with a fake implementation.
              //Note that I mocked before the controller initialization.
              spyOn(InvService, 'getROItems').and.callFake(function(cb){
                  var resultFake = {
                       lts: {
                           items: "whatever you want"
                       }
                  } 
                  cb(resultFake);
              });
              //This initializes your controller and it will use the mocked 
              //implementation of your service
              var myController = $controller("myControllerName");

              //Here we make the assertio
              expect(myController.roItems).toBe("whatever you want");
       }
  )
});

您可能希望考虑改变模式以使用承诺而不是回调。像
this.getROItems=function(){return$http.get('url');}
InvService.getROItems.then(function(res){roItems=res.lts.items;})
。在ANGLARS JS上使用承诺是非常标准的(这似乎是您正在使用的)。您可能希望考虑改变模式以使用承诺而不是回调。像
this.getROItems=function(){return$http.get('url');}
InvService.getROItems.then(function(res){roItems=res.lts.items;})
。使用Promissions在AngularJS中是相当标准的(这似乎就是您正在使用的)。这里只需添加一些味道:@PedroVaz在这里做的是在测试控制器时“模拟”服务调用。这使得您可以测试工作单元,即控制器对服务的调用。有一个单独的测试,模拟
$http.get
,并确保
getROItems
正确调用它。您不需要测试
$http.get()
是否有效;我认为AngularJS团队已经做到了:)。感谢添加@Mikemcaughan:)当然,请随意编辑您的答案并将其放在那里:)。感谢@Mikemcaughanjust在这里添加一些味道:@PedroVaz在这里做的是在测试控制器时“模拟”服务呼叫。这使得您可以测试工作单元,即控制器对服务的调用。有一个单独的测试,模拟
$http.get
,并确保
getROItems
正确调用它。您不需要测试
$http.get()
是否有效;我认为AngularJS团队已经做到了:)。感谢添加@Mikemcaughan:)当然,请随意编辑您的答案并将其放在那里:)。谢谢@Mikemcaughan