2014-02-20 2 views
3

의 컨트롤러 조롱 : 나는 d1 지침의 단위 테스트에서 d1controller 컨트롤러를 조롱 어떻게어떻게 외부 컨트롤러가있는 지시어 주어진 AngularJS와 지침

.directive('d1', function() { 
    return { 
    controller: 'd1controller', 
    restrict: 'E', 
    link: function ($scope, $element, $attributes, $controller) { 

     $controller.doStuff(); 

    } 
    }; 
}); 

를?


내 시도 :

나는 서비스 조롱 때와 같이 $provide으로 시도 :

beforeEach(module('app', function ($provide) { 
    ctrlMock = jasmine.createSpyObj('ctrlMock', ['doStuff']); 
    $provide.value('d1controller', ctrlMock); 
    })); 

을 그리고 나는 또한 괜찮은 행운이 있었다 $controllerProvider

beforeEach(module('app', function ($controllerProvider) { 
    ctrlMock = jasmine.createSpyObj('ctrlMock', ['doStuff']); 
    $controllerProvider.register('d1controller', ctrlMock); 
    })); 

답변

3

저는 OP입니다. $controllerProvider을 사용하면 효과가 있습니다. 생성자를 전달해야합니다. 인스턴스가 아닙니다.

beforeEach(module('app', function ($controllerProvider) { 
    $controllerProvider.register('d1controller', function Mock(){ 
    this.doStuff = function(){}; 
    }); 
})); 
1

으로 시도 내 모든 것을 포함하는 모의 모듈 만들기 cked services/controllers를 실행 한 다음 mock 모듈을 내 app 모듈 다음에 포함시킵니다. 기본적으로 모의 모듈에있는 모든 서비스/컨트롤러를 무시합니다.

모의 모듈과 해당 모듈을 모의 할 컨트롤러를 만드십시오.

appMock = angular.module('appMock', []); 

appMock.controller('ControllerToMockCtrl', ['$scope', function($scope) { 
    $scope.greeting = 'Hola!'; 
}]); 

테스트 중입니다.

beforeEach(function(){ 
    module('app'); 
    module('appMock'); 
}); 

이 블로그는이 전략의 좋은 예입니다. http://southdesign.de/blog/mock-angular-js-modules-for-test-di.html#using-the-mock

+0

멋진 트릭. 구현 세부 정보를 숨기기 위해'mockDirectiveController' 헬퍼를 만들었습니다. https://gist.github.com/sylvain-hamel/9122684 – Sylvain

+0

내 새로운 대답을 참조하십시오. – Sylvain