2016-10-01 72 views
2

我想實現使用茉莉花和噶瑪的Web應用程序的特定控制器的單元測試。目前,它給了以下錯誤:

Chrome 53.0.2785 (Mac OS X 10.10.5) HomeCtrl should be defined FAILED 
    Error: [$injector:unpr] Unknown provider: $scopeProvider <- $scope 
    http://errors.angularjs.org/1.5.5/$injector/unpr?p0=%24scopeProvider%20%3C-%20%24scope 

下面是測試文件的代碼:

describe('HomeCtrl', function(){ 
    var $controller, HomeCtrl; 

    beforeEach(angular.mock.module('TestModule')); 

    beforeEach(inject(function(_$controller_, _$rootScope_, _$scope_) { 
     $controller = _$controller_; 
     rootScope = $rootScope.new(); 
     scope = $scope.new(); 
     HomeController = $controller('HomeCtrl', { 
       $scope: scope 
     }); 
    })); 

    // Verify our controller exists 
    it('should be defined', function() { 
     expect(HomeController).toBeDefined(); 
    }); 
}); 

有人能告訴我什麼,我做錯了什麼?

+1

你見過這個線程http://stackoverflow.com/questions/27810179/angular-unit-test-unknown-provider-scopeprovider?它有幫助嗎?謝謝。 – alecxe

+0

是的,我已經看到了。我不明白他們是如何做不同的事情。 – MadPhysicist

回答

1

在AngularJS,所有範圍都是$rootScope孩子。

在單元測試中,您不能注入$scope因爲沒有服務存在。但有一個$rootScope供應商,其中包含API$new創建一個新的子範圍。

$rootScope.$new(),創建一個新的子範圍。

因爲,你不能注入$scope你得到(沒有這樣的供應商存在爲您提供$scope

Error: [$injector:unpr] Unknown provider: $scopeProvider <- $scope 

在回答,您所提供

beforeEach(inject(function(_$controller_, _$rootScope_) { 
    $controller = _$controller_; 
    $rootScope = _$rootScope_; 
    HomeCtrl = $controller('HomeCtrl', { 
    $scope: $rootScope, 
    }); 
    })); 

您注射$rootScope並直接通過$rootScopeHomeCtrl。它可以工作,但是在執行測試時,它將控制器代碼中的所有變量和函數添加到$rootScope

但是在實際的情況下,您的HomeCtrl期望$scope(子範圍)。因此,要複製實際場景,如果您傳遞子範圍會更好。

beforeEach(inject(function(_$controller_, _$rootScope_) { 
    $controller = _$controller_; 
    $scope = _$rootScope_.$new(); 
    HomeCtrl = $controller('HomeCtrl', { 
    $scope: $scope, 
    }); 
})); 
+0

謝謝。這是有益的和有益的! – MadPhysicist

1

下面的代碼成功:

describe('HomeCtrl', function(){ 
    var $controller, HomeCtrl; 
    var $rootScope, $scope; 

    beforeEach(angular.mock.module('TestModule')); 

    beforeEach(inject(function(_$controller_, _$rootScope_) { 
     $controller = _$controller_; 
     $rootScope = _$rootScope_; 
     HomeCtrl = $controller('HomeCtrl', { 
       $scope: $rootScope, 
     }); 
    })); 

    // Verify our controller exists 
    it('should be defined', inject(function($controller) { 
     expect(HomeCtrl).toBeDefined(); 
    })); 
});