由于服务依赖性注入,控制器测试失败

时间:2014-07-29 14:49:00

标签: angularjs jasmine

在控制器测试中使用服务时,是否需要以与控制器相同的方式初始化服务?我的意思是你需要传递它自己的依赖项吗?

例如,我可以像这样初始化我的控制器:

   // Instantiate the controller
    searchController = $controller( 'VisibilitySearchController',{
        $scope: scope,
        dataService: dataService
    });
}));

所以我需要根据所需的组件初始化服务,例如$http$resource等,以及对其功能进行spyOn调用?或者这是否应该足够? (注意 - 当我执行以下操作时,我的测试失败了)

 // Instantiate the dataService
    dataService = $injector.get( 'dataService' );  

它会抛出此错误:

* Error: [$injector:unpr] Unknown provider: $resourceProvider <- $resource <- dataService

服务的相关部分:

myAppServices.factory('dataService', ['$http', '$resource', 'authService', 'messageService', function ($http, $resource, authService, messageService) { 

 }

旁注

注意 - 我们使用Maven作为我们的构建工具,此时只使用Jasmine - 尝试将Karma作为我们的测试运行器作为Maven插件。

2 个答案:

答案 0 :(得分:1)

您必须提供所有依赖项,但您可以模拟它们。这可以通过茉莉花来完成,例如:

var mockedDataService = jasmine.createSpyObj('dataService', ['getData', 'getOtherData']);

然后你将这个模拟的服务注入$provider

beforeEach(function () {
        module(function ($provide) {
            $provide.value('dataService', mockedDataService );
        });
}

可以像这样检索此模拟服务的实例:

inject(function (dataService) {
    var dataServiceInstance = dataService;
});

这将提供者在需要时随时模拟dataService。但是,如果您需要功能完备的dataService,则必须对其进行实例化,但始终可以模拟其任何依赖。

答案 1 :(得分:1)

虽然可以手动将依赖项注入控制器,但只要您已加载服务所属的模块,就不需要这样做。

在您的情况下,您似乎没有加载ngResource模块。

如果您在测试中添加beforeEach(module('ngResource'))(并确保其所在的实际脚本文件包含在Jasmine的文件集中),则无需手动注入。

请注意,您不需要加载$http等角度核心服务,但由于$resource不属于核心,因此需要像这样加载。

如果要提供模拟实现,则手动注入依赖项非常有用。