2016-10-01 63 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(); 
    })); 
}); 
相关问题