2013-10-13 125 views
2

我是單元測試和AngularJS的新手,我有一些問題我無法解決。我的一個測試不起作用。我試圖通過影響一個值在我的測試中啓動location.path(),但在我的控制器中,location.path()仍然有一個未定義的值。

這裏是我的CONTROLER:

angular.module('...') 
.controller('SignUpCtrl', ['$location', function ($location) { 

    // Retrieve type of user 
    var userType = $location.path().substr(9); 
    if(userType == 'member'){ 
     userType = 'user'; 
    } 

    console.log($location.path()); 
    console.log(userType); 

    $scope.uType = userType; ]); 

這裏是我的測試模塊:

describe('Controller: SignUpCtrl', function() { 

// load the controller's module 
beforeEach(module('...')); 

var SignUpCtrl, 
    scope, 
    mockBackend, 
    environments, 
    location, 
    store; 

beforeEach(inject(function ($controller, $rootScope, $httpBackend,$location,_Environments_) { 
    environments = _Environments_; 
    mockBackend = $httpBackend; 
    location = $location; 
    scope = $rootScope.$new(); 

    SignUpCtrl = $controller('SignUpCtrl', { 
     $scope: scope, 
     $location: location 
    }); 
})); 

it('should come from the right location', function(){ 
    location.path('/sign-up/member'); 
    expect(location.path()).toBe('/sign-up/member'); 

    expect(scope.uType).toBe('user'); //Do not work 
}); 

});

回答

2

您正在嘗試使用單元測試來做一些只能使用端到端(或E2E)測試才能實現的功能。 AngularJS中的單元測試旨在測試給定模塊或子模塊內的javascript(例如service,factory,directive等)。但是,頁面導航或瀏覽器位置等事情確實需要在端到端測試環境中進行測試。

因此,您的$ location對象將不具有所有常規方法(如pathurl等)。 $ location對象最終只是作爲您在模塊中獲得的實際$ location對象的「模擬」而已。因此,您只需將您的測試用例it('should come from the right location', function(){ ... })移動到端到端測試,然後繼續進行其他模塊特定的單元測試。當你這樣做,你可以只抓住了$scope變量,如下面的簡化$控制器:

scope = $rootScope.new(); 
SignUpCtrl = $controller('SignUpCtrl', {$scope: scope}); 

的端到端測試的指南可以在this link找到。它引導您瞭解如何編寫良好的E2E測試。有一個非常好的框架可用於角度E2E測試,稱爲量角器。該信息在this link。量角器很快將在1.2版本中取代Karma作爲處理E2E測試的更好方法。

+0

感謝您的迴應我會看看E2E測試,因爲它仍然讓我非常困惑在單元測試中測試什麼以及E2E中的什麼... – user2876974