用服务测试控制器

时间:2015-01-23 15:58:16

标签: angularjs unit-testing dependency-injection karma-runner karma-jasmine

我是角度和单位测试的新手。

我有一个应用程序模块MyApp,包括所有其他模块所需的基本服务,例如用于记录的服务loggingService

我还有一个模块,用于处理有关map& geo-positon的所有内容,名为MapModule,我有一个应用程序逻辑的主模块,名为MainModule

MainModule包含我想测试的控制器:messageSendCtrl 控制器具有一些依赖性,例如来自MapModule的服务。

而且:MainModuleMapModuleMyApp有依赖关系,因为到处都需要loggingService

代码看起来像那样(伪代码):

MyApp的

var MyApp = angular
        .module('MyApp', ['ngRoute','MainModule','MapModule']);

MyApp.service('loggingService', function (one, two) {
   [..] /*logging data somewhere for debugging application*/
});

MainModule

var MainModule = angular
        .module('MainModule', []); 
MainModule.controller('messageSendCtrl', 
    function($scope,$http, $location, locationService, loggingService) {
[...]
});

MapModule

var MapModule = angular
        .module('MapModule', ['uiGmapgoogle-maps']);
MapModule.service('locationService', function (loggingService) {
[...]

我要测试的是来自messageSendCtrl的{​​{1}}。 (可能)我能够将位置服务注入测试环境。但注入MainModule并不成功。

可能是因为locationService也使用locationService

运行测试结果

loggingService

我的测试看起来像这样:

Error: [$injector:unpr] Unknown provider: loggingServiceProvider <- loggingService <- locationService

那么我可以解决依赖关系?或者我的申请是否存在设计问题?

1 个答案:

答案 0 :(得分:1)

有很多事情要发生,让我们逐一检查:

  1. 在您的测试中,您不需要加载所有模块,只加载该模块,您要测试,您的ctrl在您的MainModule中,所以使用just beforeEach(module('MainModule'));
  2. 每个模块都应声明其依赖项,因此您的MainModule声明应如下所示:var MainModule = angular.module('MainModule', ['MyApp']);因为您的MainModule中的某个控制器依赖于其他模块中的服务(MyApp)
  3. 更容易测试一个模块是否只做一件事,因此如果您有一个日志服务,请为其创建一个日志服务模块,并将该模块包含在您要使用日志记录的位置。 因此,不要制作负责几个不同事物的模块,因为如果其他模块需要记录,那么该模块将获得您的&#34; godmodule&#34;包含,这使得难以测试,并发现错误。