2014-01-10 3 views
2

우리는 사용자가 취한 행동을 추적하는 데 도움을주기 위해 대부분의 컨트롤러에 의존성 분석 서비스를 제공합니다.AngularJS, ngMock과 같은 모의 의존성 주입을 추출하는 방법

테스트 스위트를 만들 때마다이 서비스의 모의 버전을 설정하는 대신 ngMock 방식을 사용하고 조롱을 추상화하는 것이 좋습니다. 최선의 접근 방식은 무엇입니까? 당신은 단지 그것을 대체하는 모듈을로드하여 서비스를 대체 할 수 있습니다처럼

답변

3

편집

보인다. 내가 제대로 문제를 이해한다면 당신이 할 수

http://plnkr.co/edit/mHI19j6FDtV8UElRWvUs?p=preview


http://plnkr.co/edit/lZg8eQdoQRNtqedcr2UU?p=preview

한 가지, 컨트롤러와 모듈이 추적 서비스에 따라, 그리고에 그 의존성을 넣어하지 않는 것입니다 앱 수준에서 그런 다음 테스트에서 조롱 된 버전이 명시된 모듈을 명시 적으로로드하십시오. 그래서 같은

:

var core = angular.module('core', []); 
var analytics = angular.module('analytics', []); 
var app = angular.module('plunker', ['analytics', 'core']); 
var mockAnalytics = angular.module('mockAnalytics', []); 

core.controller('MainCtrl', function($scope, tracker) { 
    $scope.track = tracker.track(); 
}); 

analytics.factory('tracker', function() { 
    var service = {}; 

    service.track = function() { 
    return "I'm real"; 
    } 

    return service; 
}); 

mockAnalytics.factory('tracker', function() { 
    var service = {}; 

    service.track = function() { 
    return "I'm a mock"; 
    } 

    return service; 
}); 

테스트 :

describe('Testing a controller', function() { 
    var $scope = null; 
    var ctrl = null; 

    beforeEach(module('core')); 
    beforeEach(module('mockAnalytics')); 

    beforeEach(inject(function($rootScope, $controller) { 
    $scope = $rootScope.$new(); 

    ctrl = $controller('MainCtrl', { 
     $scope: $scope 
    }); 
    })); 

    it('should have its $scope.track == "I\'m a mock"', function() { 
    expect($scope.track).toEqual("I'm a mock"); 
    }); 
}); 
+0

음침한 좋은, 즉 ngMock가하는 일에 아주 가까이 있습니다. 'core '가'analytics'에 의존 할 가능성이 높기 때문에'mockAnalytics'를 명시 적으로 포함하지 않을 것입니다. 대신 테스트 모드에 자동으로 포함 된 myAppMocks 모듈을 가져와 오버라이드 값으로 제공해야합니다. – eddiec

+0

아. 글쎄, 나는 그것을 시도하고 그것이 작동하는 것처럼 보였다. 내 편집을 확인하십시오. 너가 원하는게 그거야? –