【问题标题】:Error: $injector:unpr AngularJS Testing mocking object instances错误:$injector:unpr AngularJS 测试模拟对象实例
【发布时间】:2015-11-16 15:58:16
【问题描述】:

我在测试 AngularJS 应用程序时一直遇到问题,我尝试注入所有依赖项,但它似乎不起作用,非常感谢任何帮助 :)

这是一个相当大的应用程序,我正在尝试尽可能多地分解并测试它们,但是我们有一个名为 firebaseUser 的工厂,您可以猜到它是一个 firebaseUser。我们还有一个称为userInstance 的实例,所以每当我尝试模拟userInstance 时都会遇到错误。

describe('Dashboard Start Controller', function () {

  var scope, ctrl;

  beforeEach(function () {
    MockFirebase.override();
    module('noodleApp.start');
    module('noodleApp.noodleFactory');
    module('noodleApp.firebaseUser');
    module('noodleApp.start');
  });

  beforeEach(inject(function($rootScope, $controller, $injector) {
    scope = $rootScope.$new();
    ctrl = $controller('StartController', {$scope: scope});
  }));

  afterEach(function () {
    scope.$destroy();
  });

  it('should be available', function() {
    expect(ctrl).toBeDefined();
  });

  it('should init with filter being set to all', function() {
    expect(scope.filterOn).toBe('all');
  });
});

每当我运行此测试时,我都会收到以下错误:Unknown provider: userInstanceProvider <- userInstance <- StartController

【问题讨论】:

  • 在您的代码示例中,没有“userInstance”。所以它似乎被加载到另一个文件中。您的测试是否有权访问包含 userInstance 工厂的文件?所有文件都加载了吗?你可能需要类似 module('noodleApp.userInstance'); 的东西吗?或者也许像 scope.userInstance = xyz 之类的东西?只是猜测... :)
  • 您是否将 userInstance 工厂的模块名称作为 StartController 或第一个 beforeEach() 中列出的其他模块之一的依赖项包含在内?该错误表明所有这些都缺少它(必须至少在其中一个中引用它)。
  • userInstance 不是工厂,它是工厂的实例,它是从工厂返回的,所以从技术上讲,它不是我可以包含的模块
  • 能否请您也显示 StartController 代码?这样可以更轻松地回答您的问题。
  • @Grant 听起来那是你的问题。 Angular 不知道从哪里获得userInstance,除非它被注册为提供者。而是注入工厂并在您的控制器中使用它来获取或创建用户实例。你注入 StartController 的任何东西都可以通过反射找到。这意味着 Angular 将在控制器函数上运行 toString() 以查找参数,然后它将从所有已注册的提供程序列表中查找每个提供程序,如下所示:myModule.factory('MyFactoryName', function(){ ... });' userInstance。

标签: angularjs testing mocha.js


【解决方案1】:

$controller 是对$inject 的调用,但被视为服务。发生的情况是您正在实例化控制器,但是因为使用了$inject,并且您没有传递userInstance,所以它会查找未找到的提供程序。您需要确保将 service/factory/resolve 传递给您的 $controller 方法。通过将其模拟出来并将其传递给控制器​​,您可以隔离您期望发生的事情并仅在此单元测试中测试控制器。

beforeEach(inject(function($rootScope, $controller) {
    scope = $rootScope.$new();
    userInstanceMock = {
        // mock out all methods here
        foo: sinon.stub()
    }
    ctrl = $controller('StartController', {
        $scope: scope,
        userInstace: userInstaceMock
    });
}));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 2014-08-01
    • 2016-10-21
    • 1970-01-01
    • 2014-07-22
    • 2018-11-19
    • 2014-01-24
    • 2015-12-29
    相关资源
    最近更新 更多