angular 应用程序初始化后激活 $httpMock
Activate $httpMock after angular app has been initialized
我希望能够在我的 angularJS 应用程序中打开和关闭 $httpBackend 模拟。
这意味着我要注入 $httpBackend lazily/on 需求。
如果能够再次打开和关闭它也很好。
例如,为正在从 CMS 预览的 AngularJS 应用程序提供输入数据。
以下代码仅在我将 ngMockE2E 移动到普通依赖项并以标准方式将 $httpBackend 注入我的工厂时才有效。
代码在来自配置文件的所有调用上设置 upp $httpBackend,然后响应所有调用...
const registerCalls = () => {
const injectormock = angular.injector(['ngMockE2E']); //lazy load not working as expected
const $httpBackend = injectormock.get('$httpBackend'); //lazy load not working as expected.
//Pass through for resources:
$httpBackend.whenGET(/.*.html/).passThrough();
$httpBackend.whenGET(/.*.json/).passThrough();
//API calls should be mocked:
const apiCalls = {};
for (var call in apiConfig) {
if ({}.hasOwnProperty.call(apiConfig, call)) {
const callConfig = apiConfig[call];
const url = angular.isDefined(callConfig.regex) ? callConfig.regex : callConfig.url();
if (callConfig.method === 'GET') {
apiCalls[call] = $httpBackend.whenGET(url);
} else if (callConfig.method === 'POST') {
apiCalls[call] = $httpBackend.whenPOST(url);
}
}
}
return apiCalls;
}
const success = function() {
const apiCalls = registerCalls();
for (var call in apiConfig) {
let response = {};
if (angular.isDefined(apiConfig[call].response)) {
response = apiConfig[call].response();
}
apiCalls[call].respond(200, response);
}
};
如何设置 $httpBackend 以便它可以 activated/deactivated 而 AngularJS 应用程序是 运行?
Angular 服务是在第一次注入时惰性实例化的单例。如果 $httpBackend
的注入是在应用程序 bootstrap 上执行的(使用 $http
时通常是这种情况),则无法模拟服务。
通过 angular.injector
获取 E2E $httpBackend
版本是显而易见但错误的方法。这将导致新的注入器实例使用它自己的核心服务单例($browser
,等等)。
最简洁的方法是通过 angular.mock.e2e
全局,如 . It will be available once angular-mocks.js is loaded 所示。重点是装饰$httpBackend
(这是一个函数)以包装原始和E2E实现并有条件地使用它们。
可以这样做:
angular.module('mockableHttp', [])
.decorator('$httpBackend', function ($injector, $delegate) {
var $httpBackendOriginal = $delegate;
var $httpBackendE2E = $injector.invoke(angular.mock.e2e.$httpBackendDecorator, null, {
$delegate: $delegate
});
function $httpBackend() {
var $httpBackendImplementation = $httpBackend.isMocking
? $httpBackendE2E
: $httpBackendOriginal;
return $httpBackendImplementation.apply(this, arguments);
}
return Object.assign($httpBackend, $httpBackendE2E, {
enableMocking: function() {
$httpBackend.isMocking = true;
},
disableMocking: function() {
$httpBackend.isMocking = false;
}
});
});
其中 mockableHttp
在应用程序模块中加载(可以在生产中完全排除)并且 HTTP 模拟通过 $httpBackend.enableMocking()
激活。
我希望能够在我的 angularJS 应用程序中打开和关闭 $httpBackend 模拟。
这意味着我要注入 $httpBackend lazily/on 需求。 如果能够再次打开和关闭它也很好。
例如,为正在从 CMS 预览的 AngularJS 应用程序提供输入数据。
以下代码仅在我将 ngMockE2E 移动到普通依赖项并以标准方式将 $httpBackend 注入我的工厂时才有效。
代码在来自配置文件的所有调用上设置 upp $httpBackend,然后响应所有调用...
const registerCalls = () => {
const injectormock = angular.injector(['ngMockE2E']); //lazy load not working as expected
const $httpBackend = injectormock.get('$httpBackend'); //lazy load not working as expected.
//Pass through for resources:
$httpBackend.whenGET(/.*.html/).passThrough();
$httpBackend.whenGET(/.*.json/).passThrough();
//API calls should be mocked:
const apiCalls = {};
for (var call in apiConfig) {
if ({}.hasOwnProperty.call(apiConfig, call)) {
const callConfig = apiConfig[call];
const url = angular.isDefined(callConfig.regex) ? callConfig.regex : callConfig.url();
if (callConfig.method === 'GET') {
apiCalls[call] = $httpBackend.whenGET(url);
} else if (callConfig.method === 'POST') {
apiCalls[call] = $httpBackend.whenPOST(url);
}
}
}
return apiCalls;
}
const success = function() {
const apiCalls = registerCalls();
for (var call in apiConfig) {
let response = {};
if (angular.isDefined(apiConfig[call].response)) {
response = apiConfig[call].response();
}
apiCalls[call].respond(200, response);
}
};
如何设置 $httpBackend 以便它可以 activated/deactivated 而 AngularJS 应用程序是 运行?
Angular 服务是在第一次注入时惰性实例化的单例。如果 $httpBackend
的注入是在应用程序 bootstrap 上执行的(使用 $http
时通常是这种情况),则无法模拟服务。
通过 angular.injector
获取 E2E $httpBackend
版本是显而易见但错误的方法。这将导致新的注入器实例使用它自己的核心服务单例($browser
,等等)。
最简洁的方法是通过 angular.mock.e2e
全局,如 $httpBackend
(这是一个函数)以包装原始和E2E实现并有条件地使用它们。
可以这样做:
angular.module('mockableHttp', [])
.decorator('$httpBackend', function ($injector, $delegate) {
var $httpBackendOriginal = $delegate;
var $httpBackendE2E = $injector.invoke(angular.mock.e2e.$httpBackendDecorator, null, {
$delegate: $delegate
});
function $httpBackend() {
var $httpBackendImplementation = $httpBackend.isMocking
? $httpBackendE2E
: $httpBackendOriginal;
return $httpBackendImplementation.apply(this, arguments);
}
return Object.assign($httpBackend, $httpBackendE2E, {
enableMocking: function() {
$httpBackend.isMocking = true;
},
disableMocking: function() {
$httpBackend.isMocking = false;
}
});
});
其中 mockableHttp
在应用程序模块中加载(可以在生产中完全排除)并且 HTTP 模拟通过 $httpBackend.enableMocking()
激活。