2014-01-11 32 views
21

我試圖在角度設置一個e2e測試套件,並且需要使用$ httpBackend返回罐頭響應。如果我只能返回一個文件內容,例如

$httpBackend.whenPOST('/phones').respond(function(method, url, data) { 
    return getContentOf("/somefile"); 
    }); 

我試着使用$ HTTP,沿東西的

$httpBackend.whenPOST('/phones').respond(function(method, url, data) { 
    return $http.get("/responses/phones.js"); 
    }); 

的線,但它沒有工作,你猜的角度不從$ httpBackend支持返回的承諾?

我可以做到這一點的一種方式是引用js文件,並在應用程序加載時給出響應,並將文件內容分配給變量,但能夠按需加載數據會更好。

+0

這幫了我:http://stackoverflow.com/a/18523642/2539811 –

回答

0

$ httpBackend.whenPost返回一個requestHandler對象。

根據官方的文檔:

requestHandler(是)與respond方法,其控制一個匹配請求是如何處理的對象。

  • 響應 -
    {function([status,] data[, headers, statusText]) | function(function(method, url, data, headers)}
    - respond方法採用一組靜態數據要返回或函數可以返回包含響應狀態(號碼),響應數據(字符串),響應頭的陣列(對象)和狀態文本(字符串)。

源:​​

respond方法採用一組靜態數據要返回或能夠返回一個包含陣列響應狀態(數)的函數的,響應數據(串)和響應頭(Object)。

所以,你必須做這樣的事情:

var response = 'content of somefile.js'; 
// OR var response = { foo : "bar" }; 
// OR var response = (actually consume content of somefile.js and set to response) 

$httpBackend.whenPost('/phones').respond(response); 
+3

呃..是的,我明白了。我的問題是如何檢索該文件內容。 – Evgeni

+0

我不認爲你可以按需要做。爲什麼你需要獲取文件的內容?你不能用一個假對象來嘲笑它嗎?如果你真的必須有somefile.js的內容,我會使用業力預處理器並使用文件內容。 – awei

+1

我可以,但有些回覆非常大,所以我寧願只在需要時才加入。 – Evgeni

31

因爲$ httpBackend不退還承諾的工作,你可以做到這一點的方法之一是同步您的數據。 $ HTTP沒有開箱的同步選項,所以你就必須撥打電話到您的文件沒有它,就像這樣:

$httpBackend.whenPOST('/phones').respond(function(method, url, data) { 
    var request = new XMLHttpRequest(); 

    request.open('GET', '/responses/phones.js', false); 
    request.send(null); 

    return [request.status, request.response, {}]; 
}); 
+0

不可思議!我花了整整一天的時間試圖找出使用$ http來檢索我的數據文件,並可能會放棄,如果不是這樣。謝謝@ dc-。 –

+0

你好,謝謝 – btm1

+0

這是迄今爲止最好的解決方案。要注意業力使用「基礎」作爲前綴或使用代理配置來避免的事實。作爲一個建議,首先使用完整路徑(如'http:// localhost:9876/base/src/app/modules/mock-data.json')來驗證文件是否通過測試來驗證。還要確保在用於託管'serveFiles'的karma配置中添加json文件:[ 'src/jspm_packages /**/*.*', 'src/app/**/*。ts', 'src/app/**/*。html', 'src/typings/**/*。ts', 'src/app/**/*。json'' –

6

我有我解決了同樣的問題:

$httpBackend.whenPOST("some/url").respond(function(method, url, data) { 
    return $resource("path/to/your/json/file.json").get(); 
}); 

這顯然需要angular-resource模塊才能正常工作。

+1

任何想法爲什麼這會起作用? '$ httpBackend'沒有處理'異步'調用權限? – Akash

相關問題