2016-02-29 76 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});