0

지시문을 테스트하는 동안 종속 삽입 (이해) 문제가 있습니다 (보류중인 요청이있을 때만 표시되는 AjaxLoader).AngularJS에서의 응용 프로그램 및 테스트의 주입 종속성 이해

앱 선언 :

angular.module('app', [ 
    'directives.ajaxLoader', 
    'services.httpRequestTracker', 
    [...] 
]) 

지침 코드 :

angular.module('directives.ajaxLoader', []) 
.directive('ajaxLoader', ['httpRequestTracker', 
    function(httpRequestTracker) { 
     return { 
      templateUrl: 'common/ajaxLoader.tpl.html', 
      link: function($scope) { // This function can have more parameters after $scope, $element, $attrs, $controller 
       $scope.hasPendingRequests = function() { 
        return httpRequestTracker.hasPendingRequests(); 
       }; 
      } 
     }; 
    } 
]) 

테스트 코드 : 거기에서

describe('ajaxLoader', function() { 

    beforeEach(function() { 
     module('directives.ajaxLoader', 'common/ajaxLoader.tpl.html'); 
    }); 

    describe('ajaxLoader directive', function() {}); 
}); 

, 내 지시어는 브라우저에서 완벽하게 작동하지만 테스트는 실패 같은 오류 :

Error: [$injector:unpr] Unknown provider: httpRequestTrackerProvider <- httpRequestTracker <- ajaxLoaderDirective

좋아, 그래서 내 어딘가에 의존성을 주입해야합니다. 내 직접 테스트 코드에

angular.module('directives.ajaxLoader', [ 
    'services.httpRequestTracker' 
]) 
  • : 직접 내 지시에

    • : 나는 두 가지 솔루션이
    beforeEach(function() { 
        module('directives.ajaxLoader', 'common/ajaxLoader.tpl.html', 'services.httpRequestTracker'); 
    }); 
    

    두 작품,하지만 난하지 않습니다 어느 쪽이 더 좋은지 이해하십시오 그리고 왜입니까? 그리고 처음부터 브라우저에서 작동하고 테스트에서 실패한 이유는 무엇입니까? 두 경우 모두 나의 지시 및 추적기 내 주요 애플 리케이션 선언에

    감사

답변

1

로드 모듈

services.httpRequestTracker가로드되기 때문에 응용 프로그램에서 작동을 주입된다. 당신은 주 앱 모듈 (첫 번째 코드 스 니펫)의 종속물로 선언함으로써 그렇게했습니다.

그러나 테스트 할 때 바이어스를 피하기 위해 테스트되지 않은 모든 것을 모방하고 싶습니다. 귀하의 경우, services.httpRequestTracker에 문제가 있다면 어떻게해야합니까? ajaxLoader은 좋지만 테스트가 실패 할 수 있습니다. 다른 모든 조롱하기 위해

비웃음

, 두 가지 옵션이 있습니다

사용하려면 대체하기 종속성이 있다면 모듈을 module()으로로드해야합니다.

종속성을로드해야하지만 모의 구현이있을 수 있습니다.

의존성 삽입 (Dependency Injection)

의존성 주입은 클래스를 분리 할 수 ​​있습니다. 종속성을 이름으로 해석하는 서비스 위치 지정자가 있습니다. 즉, 클래스 C의 속성 a는 '동물'유형이 (문자열 임)입니다. 각 코어의 서비스 위치 지정자는 어떤 구성 요소가이를 구현하는지 찾습니다. 이를 확인하는 방법은로드 된 모듈 (예 : 기본 앱 모듈의 종속성)을 조회하는 것입니다.

테스트 영역에이 것을 정의하지 않았지만 문제는 아닙니다. Karma는 사용할 파일 목록을 포함하는 karma.conf 파일을 사용합니다. 이 파일을 사용하여 라이브러리 또는 조롱 된 구성 요소를 추가 할 수 있습니다. 특정 문제와

는 :

이 지침은 httpRequestTracker에 따라 달라집니다. 거기에 주입하지 않으면 작동하지 않습니다 (괜찮습니다). 테스트에서 두 가지를 모두로드해야합니다. 그래서 실패한 것은 처음이었고 두 번째는 실패했습니다. 그러나 httpRequestTracker을로드하는 대신 모의 구현을로드합니다.

+0

감사합니다. 이렇게 자세히 설명해 주셔서 감사합니다;) 제 첫 번째 해결책은 '직접적인 지시에 따라'입니다. 대신 모의 테스트를 제공하거나 모의 테스트 결과를 투입해야합니까? –

+1

안녕하세요! 당신은 두 가지 별도의 것들처럼 환경과 응용 프로그램을 테스트하는 것을 고려해야합니다. 응용 프로그램에 관한 : 귀하의 지시에 주입 뭔가가 필요하면, 그것을 위해 가십시오. 삽입하면 아마도 모듈의 종속물로 선언되어야합니다. 이제, 테스트에 관해서 : 지시문에 뭔가를 주입했다면, 모의 함수 응답을 제공하기 위해 조롱하거나 간첩해야합니다. –