2016-02-29 50 views
0

我想单元测试一个具有默认范围(范围:false)的指令,但我无法注入其控制器的依赖。默认范围的指令单元测试

var MyApp = angular.module('MyApp',['MyDirectives','MyServices','MyControllers']); 

这里是指令

var MyDirectives = angular.module('MyDirectives', []); 
MyDirectives.directive('myAddress', [ '$timeout', function ($timeout) { 
    return { 
     restrict: 'A', 
     require: 'ngModel', 
     link: function (scope, elm, attr, ctrl) { 
      if (!ctrl) { 
       return; 
      } 

      elm.on('focus', function() { 
       scope.AppData.ShowSeparateAddress = false; 
      }); 

     } 
    }; 
}]); 

这里是我的控制器

var MyControllers = angular.module(' MyControllers', []); 
MyControllers.controller('Step1', [ 
'$rootScope', '$scope', 'AppData', function ($rootScope, $scope, AppData) { 
    $scope.AppData = AppData.get(); 
    } 

这里是我的应用程序服务

var MyServices = angular.module(' MyServices', []); 
    MyServices.factory('AppData', [function() { 
    var data; 
    return { 
     get: function() { 
      data = data || {}; 
      return data; 
     } 
    }; 
    }]); 

下面是地址指令

单元测试
beforeEach(module(MyApp)); 


var element, compiledElement, directiveElement; 
var scope, compile, ele,AppData,controller; 

beforeEach(inject(function(_$rootScope_, _$compile_){ 
scope = _$rootScope_.$new(); 
compile = _$compile_; 
})); 
beforeEach(inject(function(_$controller_, _AppData_){ 

    AppData = _AppData_; 
    controller = _$controller_('Step1',{scope:scope, AppData:AppData}); 
})); 
function getCompiledElement(ele) { 
    element = angular.element(ele); 
    compiledElement = compile(element)(scope); 
    scope.$digest(); 
    return compiledElement; 
    } 
it('should set show separate addrress as false when focussed',function(){ 
    ele = '<input type="text" data-my-address />'; 
    directiveElement = getCompiledElement(ele); 
    console.log(directiveElement); 
    expect(scope.AppData.ShowSeparateAddress).toBe(false); 
}); 

}); 我得到这个以下错误

Error: [$injector:unpr] Unknown provider: AppDataProvider <- AppData 

我也trieed嘲讽的服务,通过提供,但没有奏效 任何帮助或想法?

+1

当浏览器在本地运行时,这实际上是否工作? – mindparse

+0

我不确定,但是:您的控制器签名中有三个参数,并且您只传递两个参数。你应该添加$ rootScope – Zakaria

+0

@mindparse yes上面的指令工作正常。此指令使用默认范围,并且我在注入其父控制器'Step1'的指令内使用AppData服务。所以我无法在指令中模拟此AppData服务。 – deeps

回答

0

在控制器签名中有三个参数,而且只传递两个参数。您应该添加$rootScope

controller = _$controller_('Step1',{rootScope:scope, scope:scope, AppData:AppData});