2016-10-01 3 views
2

Ich versuche Unit Testing für einen bestimmten Controller einer Web-App mit Jasmine und Karma zu implementieren. Im Moment wird es gibt die folgenden Fehler:

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 

Hier ist der Code der Testdatei:

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(); 
    }); 
}); 

Könnte mir jemand sagen, was ich falsch mache?

+1

Haben Sie diesen Thread gesehen http://stackoverflow.com/questions/27810179/angular-unit-test-unknown-provider-scopeprovider? Hilft es? Vielen Dank. – alecxe

+0

Ja, ich habe es gesehen. Ich sehe nicht, wie sie etwas anders machen. – MadPhysicist

Antwort

1

In AngularJS alle Bereiche Kinder $rootScope sind.

In Komponententests können Sie nicht injizieren$scope da gibt es keinen Dienst, der existiert. Aber es gibt einen $rootScope Provider, der API wie $new enthält, um einen neuen untergeordneten Bereich zu erstellen.

$rootScope.$new(), erstellen Sie einen neuen untergeordneten Bereich.

Da können Sie nicht injizieren $scope Sie bekommen (kein solcher Anbieter existiert Sie $scope zur Verfügung zu stellen)

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

In der Antwort, Sie haben zur Verfügung gestellt,

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

Sie Pritzen $rootScope und direkt die $rootScope zu HomeCtrl übergeben. Es funktioniert, aber während der Tests fügt es alle Variablen und Funktionen in Controller-Code $rootScope.

Aber im realen Szenario erwartet Ihre HomeCtrl eine $scope (Kindbereich). Um das tatsächliche Szenario zu replizieren, wäre es besser, wenn Sie einen untergeordneten Bereich übergeben.

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

Danke. Das war lehrreich und hilfreich! – MadPhysicist

1

Der folgende Code folgt:

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(); 
    })); 
}); 
Verwandte Themen