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