我試圖嘲笑對一個JSONP GET請求的迴應,這是一個函數,該函數返回一個ES6承諾,我已包裝在$q.when()
。代碼本身工作得很好,但是,在單元測試中,請求沒有被$ httpBackend捕獲,而是直接到達實際的URL。因此,當調用flush()
時,我得到一個錯誤,說明Error: No pending request to flush !
。 JSONP請求是通過jQuery的$.getJSON()
在ES6承諾中完成的,所以我選擇通過提供一個正則表達式來代替一個硬編碼的URL來嘗試捕獲所有傳出的請求。
我一直在努力研究這個問題,現在仍然還沒有明白是什麼導致了電話通過。我感覺好像ES6承諾中的HTTP請求正在「Angular之外」被做出來,所以$ httpBackend不知道它/不能夠捕獲它,儘管如果正在進行該調用可能不是這種情況在一個$ q承諾從一開始。任何人都可以告訴我爲什麼這個電話正在通過,爲什麼簡單的超時會工作得很好?我試過$scope.$apply
,$scope.$digest
和$httpBackend.flush()
的所有組合,但無濟於事。
也許有些代碼將更好地解釋它...
控制器
function homeController() {
...
var self = this;
self.getData = function getData() {
$q.when(user.getUserInformation()).then(function() {
self.username = user.username;
});
};
}
單元測試
...
beforeEach(module('home'));
describe('Controller', function() {
var $httpBackend, scope, ctrl;
beforeEach(inject(function(_$httpBackend_, $rootScope, $componentController) {
$httpBackend = _$httpBackend_;
scope = $rootScope.$new(); // used to try and call $digest or $apply
// have also tried whenGET, when('GET', ..), etc...
$httpBackend.whenJSONP(/.*/)
.respond([
{
"user_information": {
"username": "TestUser",
}
}
]);
ctrl = $componentController("home");
}));
it("should add the username to the controller", function() {
ctrl.getData(); // make HTTP request
$httpBackend.flush(); // Error: No pending request to flush !
expect(ctrl.username).toBe("TestUser");
});
});
...
出於某種原因,這個工程,但是:
it("should add the username to the controller", function() {
ctrl.getData(); // make HTTP request
setTimeout(() => {
// don't even need to call flush, $digest, or $apply...?
expect(ctrl.username).toBe("TestUser");
});
});
httpBackend是一個模擬實現它,如果你不使用$ http服務,以便爲單元測試的角度注入$ http服務,一個請求,你將無法使用httpBackend來捕獲它 –