diff --git a/src/ngMock/angular-mocks.js b/src/ngMock/angular-mocks.js index 110ef3e2d7f2..79b8b631ea2f 100644 --- a/src/ngMock/angular-mocks.js +++ b/src/ngMock/angular-mocks.js @@ -1313,9 +1313,8 @@ angular.mock.dump = function(object) { }); ``` */ -angular.mock.$HttpBackendProvider = function() { - this.$get = ['$rootScope', '$timeout', createHttpBackendMock]; -}; +angular.mock.$httpBackendDecorator = + ['$rootScope', '$timeout', '$delegate', createHttpBackendMock]; /** * General factory function for $httpBackend mock. @@ -1336,7 +1335,10 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) { expectations = [], responses = [], responsesPush = angular.bind(responses, responses.push), - copy = angular.copy; + copy = angular.copy, + // We cache the original backend so that if both ngMock and ngMockE2E override the + // service the ngMockE2E version can pass through to the real backend + originalHttpBackend = $delegate.$$originalHttpBackend || $delegate; function createResponse(status, data, headers, statusText) { if (angular.isFunction(status)) return status; @@ -1421,7 +1423,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) { // if $browser specified, we do auto flush all requests ($browser ? $browser.defer : responsesPush)(wrapResponse(definition)); } else if (definition.passThrough) { - $delegate(method, url, data, callback, headers, timeout, withCredentials, responseType, eventHandlers, uploadEventHandlers); + originalHttpBackend(method, url, data, callback, headers, timeout, withCredentials, responseType, eventHandlers, uploadEventHandlers); } else throw new Error('No response defined !'); return; } @@ -1897,6 +1899,8 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) { responses.length = 0; }; + $httpBackend.$$originalHttpBackend = originalHttpBackend; + return $httpBackend; @@ -2394,7 +2398,6 @@ angular.module('ngMock', ['ng']).provider({ $exceptionHandler: angular.mock.$ExceptionHandlerProvider, $log: angular.mock.$LogProvider, $interval: angular.mock.$IntervalProvider, - $httpBackend: angular.mock.$HttpBackendProvider, $rootElement: angular.mock.$RootElementProvider, $componentController: angular.mock.$ComponentControllerProvider }).config(['$provide', '$compileProvider', function($provide, $compileProvider) { @@ -2402,6 +2405,7 @@ angular.module('ngMock', ['ng']).provider({ $provide.decorator('$$rAF', angular.mock.$RAFDecorator); $provide.decorator('$rootScope', angular.mock.$RootScopeDecorator); $provide.decorator('$controller', createControllerDecorator($compileProvider)); + $provide.decorator('$httpBackend', angular.mock.$httpBackendDecorator); }]); /** @@ -2416,7 +2420,6 @@ angular.module('ngMock', ['ng']).provider({ * the {@link ngMockE2E.$httpBackend e2e $httpBackend} mock. */ angular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) { - $provide.value('$httpBackend', angular.injector(['ng']).get('$httpBackend')); $provide.decorator('$httpBackend', angular.mock.e2e.$httpBackendDecorator); }]); diff --git a/test/ngMock/angular-mocksSpec.js b/test/ngMock/angular-mocksSpec.js index 8e696f58072a..5cbab083c6f8 100644 --- a/test/ngMock/angular-mocksSpec.js +++ b/test/ngMock/angular-mocksSpec.js @@ -2432,13 +2432,15 @@ describe('ngMock', function() { describe('ngMockE2E', function() { describe('$httpBackend', function() { - var hb, realHttpBackend, callback; + var hb, realHttpBackend, realHttpBackendBrowser, callback; beforeEach(function() { callback = jasmine.createSpy('callback'); angular.module('ng').config(function($provide) { realHttpBackend = jasmine.createSpy('real $httpBackend'); - $provide.value('$httpBackend', realHttpBackend); + $provide.factory('$httpBackend', ['$browser', function($browser) { + return realHttpBackend.and.callFake(function() { realHttpBackendBrowser = $browser; }); + }]); }); module('ngMockE2E'); inject(function($injector) { @@ -2477,6 +2479,14 @@ describe('ngMockE2E', function() { expect(realHttpBackend).not.toHaveBeenCalled(); expect(callback).toHaveBeenCalledOnceWith(200, 'passThrough override', '', ''); })); + + it('should pass through to an httpBackend that uses the same $browser service', inject(function($browser) { + hb.when('GET', /\/passThrough\/.*/).passThrough(); + hb('GET', '/passThrough/23'); + + expect(realHttpBackend).toHaveBeenCalledOnce(); + expect(realHttpBackendBrowser).toBe($browser); + })); });