【问题标题】:Angular JS: Error: [$injector:unpr] Unknown provider: $scopeProviderAngular JS:错误:[$injector:unpr] 未知提供者:$scopeProvider
【发布时间】:2015-11-19 18:29:21
【问题描述】:

我正在尝试为我的应用编写一些单元测试,但我遇到了一个问题,我收到了这个错误:

Chrome 46.0.2490 (Mac OS X 10.10.5) app.customer "before each" hook for "should be created successfully" FAILED 错误:[$injector:unpr] 未知提供者:$scopeProvider

我的test.js 文件如下所示:

describe('app.customers', function() {
  var controller;

  beforeEach(function() {
    module('app', function($provide) {});
    specHelper.injector(function($controller, $q, $rootScope, DataService) {});
  });

  beforeEach(function() {
    sinon.stub(DataService, 'getCustomers', function() {
      var deferred = $q.defer();
      deferred.resolve(mockData.getMockCustomers());
      return deferred.promise;
    });

    controller = $controller('Customer');
    $rootScope.$apply();
  });

  describe('Customer Controller', function() {
    it('should be created successfully', function() {
      expect(controller).to.be.defined;
    });
  });

  specHelper.verifyNoOutstandingHttpRequests();
});

我不确定它为什么要查找 $scopeProvider,因为我在测试中没有引用 $scope.provider

一般来说,我对单元测试还很陌生,因此我们将不胜感激。提前致谢!

提前致谢!

【问题讨论】:

标签: javascript angularjs unit-testing


【解决方案1】:

您必须使用本地范围初始化控制器。

beforeEach(function() {
    sinon.stub(DataService, 'getCustomers', function() {
      var deferred = $q.defer();
      deferred.resolve(mockData.getMockCustomers());
      return deferred.promise;
    });

    // inject local scope into controller
    controller = $controller('Customer', {$scope: $rootScope});
    $rootScope.$apply();
});

我的猜测是您的客户控制器需要 $scope,但没有提供它。这是在应用程序中运行时自动为您完成的,但在通过 $controller 进行单元测试时需要手动提供。

【讨论】:

  • 嗯,现在错误已更改为:Error: Unexpected request: GET views/login.html No more request expected。同样,此路径未在我的客户控制器中引用,而是在我的路由文件中。
  • 好吧,您的问题是围绕未知提供者 $rootScopeProvider,我为您提供了解决方案...我想知道您是否应该暂时删除您的 specHelper.verifyNoOutstandingHttpRequest(),因为我不确定这是在做什么。
  • 嗯,我应该创建另一个涵盖此问题的问题吗?删除 specHelper.verifyNoOutstandingHttpRequest() 对我收到的错误没有影响。
  • 如果您发布另一个问题,我建议您添加更多代码,也许是控制器,甚至 specHelper 是什么。我认为发生了一些 $httpBackend 的事情,它预计没有未完成的请求,但是您的路由模块配置正在向 views/login.html 发出请求——仍然认为这是通过 specHelper 以某种方式驱动的,但再次——不要'不知道这是在做什么。
猜你喜欢
  • 2015-08-12
  • 2016-05-09
  • 2017-04-03
  • 1970-01-01
  • 1970-01-01
  • 2016-03-26
  • 1970-01-01
  • 2014-04-10
  • 2017-04-16
相关资源
最近更新 更多