角度控制器在茉莉花测试中未定义

时间:2015-04-20 09:02:30

标签: javascript angularjs dependency-injection jasmine

我目前在为控制器编写测试时遇到问题。在下面的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,所以我知道它绝对没有被实例化。

enter image description here

我在这里创建了相关文件的要点:https://gist.github.com/junderhill/e181ce866ab1ebb1f805

未正确实例化活动控制器导致我的测试失败。关于可能导致这种情况的任何想法都将受到赞赏。感谢

2 个答案:

答案 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。

希望有所帮助!

埃里克