所以我遇到了一個情況,就是我們不得不擊中不在我們控制下的「寧靜」服務,爲了從GET服務中獲得json的服務,我們必須通過Content-Type =「application/json」。唯一的問題是Angular從GET請求標題中去除Content-Type。我發現了一個博客帖子上使用$ httpBackend一個裝飾,使我們能夠攔截呼叫被髮送之前,並添加回內容類型建議:
angular
.module('MyApp')
.decorator('$httpBackend', [
'$delegate', function($delegate) {
return function() {
var contentType, headers;
headers = arguments[4];
contentType = headers != null ? headers['X-Force-Content-Type'] : null;
if (contentType != null && headers['Content-Type'] == null)
headers['Content-Type'] = contentType;
return $delegate.apply(null, arguments);
};
}]);
是這樣,那精美的作品!現在我們的問題是它打破了我們使用模擬$ httpBackend服務的所有單元測試。我們得到的唯一錯誤是「未定義」。
Ex。單元測試方法:
it('should return service.model.error if service returns an exception code from EndProject',
inject(function($httpBackend) {
var mockResponse = sinon.stub({ 'exception': 'Unable to retrieve service data' });
$httpBackend.whenPUT(this.endProjectUrl).respond(mockResponse);
var data;
this.service.EndProject().then(function(fetchedData) {
data = fetchedData;
});
$httpBackend.flush();
expect(data.error.state).toBe(true);
expect(data.error.message).toEqual('Unable to retrieve service data');
}));
PhantomJS 2.1.1(Mac OS X的0.0.0)projectService EndProject應該返回service.model.error如果服務返回從EndProject異常代碼FAILED 未定義 /用戶/ mlm1205 /Documents/THDSource/bolt-projects/html_app/src/app/components/services/project/projectService.spec.js:213:41 invoke @/Users/mlm1205/Documents/THDSource/bolt-projects/html_app/bower_components/angular/angular.js:4560:22 [email protected]/Users/mlm1205/Documents/THDSource/bolt-projects/html_app/bower_components/angular-mocks/angular-mocks.js:2518:26
我試過了,但是這個調用仍然在剝離Content-Type。我有一個攔截器,它注入了我們的負載均衡器所需的另一個頭,並且已經嘗試過這種Content-Type,但它不起作用。我通過攔截器代碼進行調試,並確認它確實添加了標題,但是當您查看「網絡」選項卡(Chrome開發工具)中的實際調用時,Content-Type標頭消失了。 – Shaggy13spe
我想我以前曾經誤解過你的情況。儘管事實上單元測試沒有提出真正的請求,但您已經有了適用於您的現有生產裝飾器,但在單元測試中失敗。我已經更新了答案。看到關於PhantomJS的評論,我很確定錯誤信息因此被破壞,並且應該說'undefined不是一個函數',因爲'$ httpBackend.whenPUT(...)'。 – estus
是的,抱歉,如果我沒有更清楚。我會盡量按照你的建議玩一下。我真的想要推回創建該服務的團隊來改變它,因爲在GET請求上需要該頭部是很荒謬的。 – Shaggy13spe