AngularJS+Jasmin: $httpBackend가 예상대로 작동하지 않습니다.
저는 자스민을 카르마와 함께 사용하여 Angular 기반의 앱을 테스트하고 있습니다.
저는 사용자 데이터를 로드하는 서비스를 테스트해야 하고 $httpBackend를 사용하여 응답을 조롱하고 있습니다.그러나 테스트를 실행했을 때 두 가지 오류가 발생했습니다.
- 오류: 플러시할 보류 중인 요청이 없습니다!
- 오류: 불만족스러운 요청: GET https://api.github.com/users/wilk
모듈:
'use strict';
app.service ('UserService', ['$resource', '$q', 'GITHUB_API_URL', function ($resource, $q, GITHUB_API_URL) {
var userResource = $resource (GITHUB_API_URL + '/users/:user', {user: '@user'}) ,
userModel = {};
return {
data: function () {
return userModel;
} ,
populate: function (user) {
var deferred = $q.defer () ,
userRequest = userResource.get ({user: user});
$q
.when (userRequest.$promise)
.then (function (data) {
userModel = data;
deferred.resolve (data);
});
return deferred.promise;
}
};
}]);
테스트:
'use strict';
describe ('Service: UserService', function () {
beforeEach (module ('myApp'));
var $appInjector = angular.injector (['myApp']) ,
UserService = $appInjector.get ('UserService') ,
GITHUB_API_URL = $appInjector.get ('GITHUB_API_URL') ,
GITHUB_USER = $appInjector.get ('GITHUB_USER') ,
$httpBackend;
beforeEach (inject (function ($injector) {
$httpBackend = $injector.get ('$httpBackend');
$httpBackend
.when ('GET', GITHUB_API_URL + '/users/' + GITHUB_USER)
.respond ({
login: GITHUB_USER ,
id: 618009
});
}));
afterEach (function () {
$httpBackend.verifyNoOutstandingExpectation ();
$httpBackend.verifyNoOutstandingRequest ();
});
describe ('when populate method is called', function () {
it ('should returns user data', function () {
$httpBackend.expectGET (GITHUB_API_URL + '/users/' + GITHUB_USER);
UserService.populate (GITHUB_USER);
$httpBackend.flush ();
expect(UserService.data ()).toEqual ({
login: GITHUB_USER ,
id: 618009
});
});
});
});
GUITH_API_URL이 'https://api.github.com/' '과 같고 GUITH_USER가 'wilk'과 같다고 가정해 보겠습니다.
카르마-재스민 0.1.5 및 AngularJS 1.2.6(Angular Mocks 및 시나리오 1.2.6 포함)으로 이 테스트를 실행하고 있습니다.
이 코드에 무슨 문제가 있습니까?
각각의 오류에 대해 따로 이야기해 보겠습니다.
오류: 플러시할 보류 중인 요청이 없습니다!
그 이유는 어떤 요청도 하지 않았기 때문입니다.$httpBackend
, 그래서 물을 내릴 것이 없습니다.그건 당신이 순간화하고 있기 때문입니다.UserService
전에$httpBackend
그래서 Angular는 진짜 대신에 그것을 사용해야 한다는 것을 알지 못합니다.$http
. 콘솔을 체크아웃하면 실제 요청이 전송되고 있음을 알 수 있습니다.
오류: 불만족스러운 요청: GET https://api.github.com/users/wilk
위와 같은 이유.부터$httpBackend
서비스를 이용하는 것이 아니라, 당신이 만들어낸 기대는 결코 충족되지 않습니다.
다음은 위의 모든 사항을 고려한 후 귀사의 사양을 재분류한 것입니다.
describe ('Service: UserService', function () {
var UserService,
GITHUB_API_URL,
GITHUB_USER,
$httpBackend;
beforeEach(function() {
module('plunker');
inject(function( _$httpBackend_, _UserService_, _GITHUB_API_URL_, _GITHUB_USER_) {
$httpBackend = _$httpBackend_;
UserService = _UserService_;
GITHUB_API_URL = _GITHUB_API_URL_;
GITHUB_USER = _GITHUB_USER_;
});
});
afterEach (function () {
$httpBackend.verifyNoOutstandingExpectation ();
$httpBackend.verifyNoOutstandingRequest ();
});
describe ('when populate method is called', function () {
it ('should returns user data', function () {
$httpBackend
.whenGET(GITHUB_API_URL + '/users/' + GITHUB_USER)
.respond ({
login: GITHUB_USER,
id: 618009
});
UserService.populate(GITHUB_USER);
$httpBackend.flush();
expect(UserService.data().login).toBe(GITHUB_USER);
expect(UserService.data().id).toBe(618009);
});
});
});
참고: 주입 방식을 조금 바꿨지만, 지금 하고 있는 방식은 당신이 만드는 한 괜찮습니다.$httpBackend
무엇보다도
언급URL : https://stackoverflow.com/questions/21577718/angularjsjasmine-httpbackend-not-working-as-expected
'programing' 카테고리의 다른 글
숫자에서 최하위 비트의 값을 얻으려면 어떻게 해야 합니까? (0) | 2023.10.27 |
---|---|
백슬래시가 포함된 printf의 출력 이해 (\012) (0) | 2023.10.27 |
Oracle에서는 테이블에 열을 "삽입"할 수 있습니까? (0) | 2023.10.27 |
Spring ApplicationListener가 이벤트를 수신하지 않습니다. (0) | 2023.10.27 |
Woocommerce/Wordpress - 사용자 로그인을 홈페이지로 리디렉션 (0) | 2023.10.27 |