2014-03-13 151 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