【发布时间】:2016-12-20 12:32:51
【问题描述】:
我必须对我的控制器进行单元测试。首先,我必须为我的服务创建模拟。
这是我的服务:
angular.module("demo-app")
.factory("empService",function($http){
var empService={};
empService.getAllEmployees=function(){
return $http.get("http://localhost:3000/api/employees");
}
empService.postEmployee=function(emp){
return $http.post("http://localhost:3000/api/employees",emp);
}
empService.getEmployee=function(id){
return $http.get("http://localhost:3000/api/employees/"+id)
}
empService.putEmployee=function(emp){
return $http.put("http://localhost:3000/api/employees/"+emp._id,emp)
}
empService.deleteEmployee=function(id){
return $http.delete("http://localhost:3000/api/employees/"+id);
}
empService.findEmployee=function(emp){
return $http.post("http://localhost:3000/api/employees/search",emp);
}
return empService;
})
这是我的控制器中的 findData() 方法,我将对其进行测试:
$scope.findData=function(){
$scope.loadingEmployee=true;
var emp={};
listProp=Object.getOwnPropertyNames($scope.searchEmployee);
for(index in listProp){
if($scope.searchEmployee[listProp[index]]!=""){
emp[listProp[index]]=$scope.searchEmployee[listProp[index]];
}
}
console.log(emp);
empService.findEmployee(emp).then(function(data){
$scope.allEmployees=data.data;
console.log(data.data);
$scope.loadingEmployee=false;
});
}
如何模拟我的 empService.findEmployee(emp) 方法,以便测试 findData() 方法。
我的 spec.js 测试文件模拟了我的服务方法。这里是:
beforeEach(function(){
var emp={"name":"sanjit"};
fakeService={
getAllEmployees:function(emp){
def=q.defer();
def.resolve({data:[{"name":"sanjit"},{'name':'ssss'}]});
return def.promise;
},
findEmployee:function(emp){
var def=q.defer();
def.resolve({data:[{"name":"sanjit"}]});
console.log("working");
return def.promise;
}
};
spyOn(fakeService,'findEmployee').and.callThrough();
fakeService.findEmployee(emp);
});
beforeEach(angular.mock.inject(function($rootScope,$controller,$injector,$q){
httpBackend=$injector.get('$httpBackend');
scope=$rootScope.$new();
q=$q;
ctrl=$controller('adminEmployeeCtrl',{$scope:scope,empService:fakeService});
}));
it('findData test',function(){
scope.$apply();
scope.findData();
expect(scope.loadingEmployee).toEqual(false);
})
但是我又遇到了一个错误:
Error: Unexpected request: GET dashboard/views/dashboard-new.html
No more request expected
但我没有打电话。请帮帮我
【问题讨论】:
-
你不是在更新的问题中对不同的方法进行单元测试吗?
-
对不起@tanmay。我已经更新了我的 spec.js 测试文件。
-
你为什么在你的规范中调用
scope.$apply()?如果删除它会发生什么? -
因为我在我的虚假服务中使用异步调用。所以我认为它需要 $apply() 或 $digest()。我说得对吗@tanmay?
-
您可能需要在
$scope.findData通话之后执行此操作?另外,我添加了处理它的答案。
标签: angularjs unit-testing jasmine karma-jasmine