2014-03-06 137 views
1

我是新来茉莉花测试,我无法得到一个关于如何我可以单元测试我的控制器的完整画面。我的控制器做了一些任务,我基本上想要测试做以下事情:茉莉花测试的嘲笑服务?

  1. 它调用的模拟服务。
  2. 模拟范围内的数据。
  3. 测试控制器中特定方法的行为。
  4. 验证:服务已被调用一次。
  5. 验证:服务传递了正确的数据。

我将需要尽可能完整的例子如何编写一个测试,以及用什么声明来模拟这些方法。问题

控制器的方法是这样的:

.controller('ProjectConfigurationCtrl', function($scope, $routeParams, InfraService, ProjectConfigurationService) { 
    // some pre-init... 

    $scope.clickUpdate = function() { 
    if ($scope.projectData.Id === 0) { 
     ProjectConfigurationService.save(angular.toJson($scope.projectData), function(project) { 
     $scope.projectData = project; 
     $scope.newproject = false; 
     $scope.info = "Project " + project.ProjectName + " created successfully."; 
     }, function() { 
     $scope.info = "Project " + $scope.projectData.ProjectName + " can not be created: server error."; 
     }); 
     } else { 
     ProjectConfigurationService.update(angular.toJson($scope.projectData), function() { 
     $scope.info = "Project " + $scope.projectData.ProjectName + " updated successfully."; 
     }, function() { 
     $scope.info = "Project " + $scope.projectData.ProjectName + " can not be updated: server error."; 
    }); 
} 

我想看看是否ProjectConfigurationService.save/update被称为一次,并检查哪些抵达这些调用作为参数。我想嘲笑服务返回信息。调用之后,我想检查$ scope.newproject,$ scope.info等,看看里面有什么。

回答

1

查看Angular Unit Testing on Controller using a Service - Breaking on Inject的回答作为参考茉莉花测试。如果需要,您可以在网上搜索更多示例。

我很高兴看到你的想法是“单元测试”是正确的,所以继续下去。关键是,您必须注入$ controller,这是一个控制器构造函数服务,允许您传递嘲讽的依赖关系。在你的情况下,在你的“它”功能,你应该有这样的事情:

var projectConfigCtrl = $controller('ProjectConfigurationCtrl', // name of your controller 
    /* mocked dependencies */ {$scope: <yourMockedScope, usually $rootScope.$new>, 
           $routeParams: <your mock>, 
           InfraService: <your mock service>, 
           ProjectConfigurationService: <your mock service>});