【发布时间】: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