2014-03-13 152 views
0

我是新编写单元测试。我正在尝试简单的事情,在我的saveInfo控制器$scope.practice函数中应该包含一个值。Angularjs单元测试错误

我正在使用webstorm来运行我的测试。我想检查saveInfo函数$ scope.practice是否定义。

测试/ practice.js

'use strict'; 
describe('myApp', function() { 
    describe('Controller: PracticeCtrl', function() { 
     var $http, $scope, $routeParams, $location, $locale, $timeout; 
     // load the controller's module 
     beforeEach(function() { 
      // Load the controller's module 
      module('myApp'); 

      inject(function ($controller, $rootScope) { 
       $scope = {}; 
      }); 

     }); 

     it('should define a practice property', function() { 
      expect($scope.practice).toBeDefined(); 
     }); 

    }); 
}); 

practice.js - 控制器

angular.module('myApp').controller('PracticeCtrl', function ($http, $scope, $routeParams, $location, $locale, $timeout) { 

$scope.saveInfo = function() { 
     $scope.practice = '52300099'; 
     Practices.updateStampApproval().updateInfo($scope.practice); 

}; 

$scope.updateInfo = function() { 
    .... 
} 

$scope.getInfo = function() { 
    .... 
} 

给我错误: -

Expected undefined to be defined. 
Error: Expected undefined to be defined. 

在我的控制器$scope.practice定义。所以为什么它显示错误。

如何测试function明智意味着我如何编写测试,它将只在控制器中的1个函数中进行检查,例如, 'saveInfo'?

回答

2

您正在将$scope初始化为一个空对象,并且不会在任何地方进行操作。这就是为什么你的测试失败。

你应该做的:

  1. 初始化控制器与虚拟$scope
  2. 调用每个在每个测试
  3. 您的控制器方法做你的断言在每个测试

对于例如:

describe('myApp', function() { 
    describe('Controller: PracticeCtrl', function() { 
     var $http, $scope, $routeParams, $location, $locale, $timeout, practiceCtrl; 

     // load the controller's module 
     beforeEach(function() { 
      // Load the controller's module 
      module('myApp'); 

      inject(function ($controller, $rootScope) { 
       $scope = $rootScope.$new(); 
       practiceCtrl = $controller("PracticeCtrl", { 
        $scope: $scope 
       }); 
      }); 

     }); 

     it('should define a practice property', function() { 
      $scope.saveInfo(); 
      expect($scope.practice).toBeDefined(); 
     }); 

    }); 
}); 

我希望我已经足够清楚地帮助你。

+0

这变得很清楚,但我有一个疑问......如果我在我的控制器中使用了一个'service',它带来了一个实践列表,我可以在我的'test.js'中调用这个服务吗? – Anup

+0

是的。您可以模拟/存根以返回一些示例练习,因此您不必依靠服务器的数据。 – gustavohenke

+0

我真的想要服务器的数据...因为我不会写一个模拟服务,而是使用真正的服务... – Anup