我目前在为控制器编写测试时遇到问题。在下面的beforeEach
块中,我需要实例化一个activityController并注入scope对象。我在调用$ controller服务之前添加了一个控制台日志,然后输出,但是从来没有调用过,因此在$controller
块中出现了问题。
beforeEach(inject(function($controller) {
console.log(activityController);
activityController = $controller('activityController', {
'$scope': $scope
});
console.log("TEST");
}));
在我的测试中,我看到Type Error: activityController is undefined in C:\.......\activity.controller.test.js
,所以我知道它绝对没有被实例化。
我在这里创建了相关文件的要点:https://gist.github.com/junderhill/e181ce866ab1ebb1f805
未正确实例化活动控制器导致我的测试失败。关于可能导致这种情况的任何想法都将受到赞赏。感谢
答案 0 :(得分:1)
杰森。
尝试在创建控制器时设置activityService
,因为您还应该注入所有服务。
答案 1 :(得分:0)
看起来这一行可能会导致问题:
mockRoleService.setCurrentRole({"AssignmentID":21,"EndDate":"2049-12-31T00:00:00","StartDate":"2000-01-01T00:00:00","UserType":1,"AccessLevel":"00000000-0000-0000-0000-000000000000","Description":"Demonstration Territory 1","TeamID":null});
看起来你正在使用roleService的实际注入版本而不是存根文字,所以它实际上会启动你的实现,这就是...
this.setCurrentRole = function(role){
currentRole = role;
$http.get("http://localhost:14938/api/User/GetTeamForAssignment?assignmentId=" + role["AssignmentID"] + "&assignmentType=" + role["UserType"])
.success(function (data) {
currentTeam = data;
});
}
如果您要使用$ httpBackend模拟直接使用该服务,我实际上将该操作包装在$ q.defer()中,因为当前就是这样,这是一个异步调用。您希望完成该操作以正确设置currentTeam。所以,也许像..
this.setCurrentRole = function(role){
var deferred = $q.defer();
currentRole = role;
$http.get("http://localhost:14938/api/User/GetTeamForAssignment?assignmentId=" + role["AssignmentID"] + "&assignmentType=" + role["UserType"])
.success(function (data) {
currentTeam = data;
deferred.resolve();
});
return deferred.promise;
}
显然,如果某些东西从HTTP回来,那么会做一些deferred.reject。
希望有所帮助!
埃里克