2014-12-19 4 views
4

이 모듈을 jasmine에서 어떻게 테스트합니까? 문제는 $controller을 테스트하는 것이 매우 어렵다는 것입니다. 기능이 클로저 내부에 숨겨져있어 테스트하기가 매우 어렵 기 때문입니다.jasmine을 사용하여 IIFE 내부에 정의 된 angularjs 모듈을 테스트하는 방법은 무엇입니까?

즉, 아래 모듈 정의에서 MainCtrl에 대한 단위 테스트를 작성하는 것은 불가능한 것처럼 보입니다.

(function() { 

    'use strict'; 

    angular.module('app', []); 

    function MainCtrl() { 
     var mc = this; 
     mc.obj = { 
     val : 50 
     }; 
    } 

    angular.module('app').controller('MainCtrl', MainCtrl); 

}()); 

및 "일반"자스민 시험

describe('app', function(){ 

    beforeEach(module('app')); 

    it('should create an objet with val 50', inject(function(_$controller_) { 
    var scope = {}, 
     ctrl = _$controller_('MainCtrl', {$scope:scope}); 

    expect(scope.obj.val).toBe(50); // returns Expected undefined to be 50. 
    })); 

}); 

경우 각 분사 쟈스민 테스트 기능 내부 _$controller_ 서비스 미정 $ 범위와 제어기 생성 복귀 인스턴스.

그럼 어떻게 테스트 할 수 있습니까?

이 문제에 대한 해결책을 찾기 위해 StackOverflow에서 내 검색을 시도해 보았습니다. 내가 찾던 답변을 제공하지 않았기 때문에 내 자신을 구현했습니다.

+2

: var scope = $rootScope.$new();

  • 빌드 컨트롤러 : inject(function (_$controller_, _$rootScope_)

  • 새로운 영역을 구축 질문은 동등하다. 그러나 현재 나는이 질문이 불분명하고 덜 유용하다고 생각한다. 이것을 명확하고 간결한 질문으로 다시 말할 수 있습니까 ([ask] 참조)? 지금은 설명이없는 코드 블록에 불과합니다. –

  • 답변

    1

    단순히이 작업을 수행하여 자스민 테스트 할 수 있습니다

    describe('app', function() { 
    
        var $controller; 
    
        beforeEach(function() { 
    
         module('app'); 
    
         inject(function (_$controller_) { 
    
          $controller = _$controller_('MainCtrl'); 
    
         }); 
        }); 
    
        //-- spec - test controller 
    
        describe('Controller : MainCtrl', function() { 
    
         it('should create an object with val 50', function() { 
    
          expect($controller.obj.val).toBe(50); 
    
         }); 
        }); 
    
    }); 
    

    가 여기

    는 희망이 도움에 대한 jsfiddle입니다! 당신은 정의되지 않은 범위를 가져 오는

    var scope = {}, ctrl = _$controller_('MainCtrl', {$scope:scope});

    +0

    "재스민"이라고하면 [이 재스민] (http://jasmine.github.io/)을 의미합니까? –

    +0

    @AndrewT. 예, 그것이 제가 의미했던 것입니다. 설명해 주셔서 감사합니다 –

    0

    문제는 여기에있다. 당신이 뭔가를 할 필요가 :

    1. 를 주입 $rootScope : 자신의 응답 var ctrl = _$controller_('MainCtrl', {$scope: scope});

    +0

    2 단계 : var scope = _ $ rootScope _. $ new()? (당신은 하이픈을 놓쳤다) –