반응형
어떻게 하면 $http로 결과를 조롱할 수 있을까요?내 Angular 테스트에서 약속을 얻습니다.JS 컨트롤러?
많이 읽어본 결과, Angular에서 웹 서비스를 호출하는 권장 방법은 다음과 같습니다.JS 컨트롤러는 팩토리를 사용하고, 거기서 약속을 반환합니다.
여기 샘플 API라고 불리는 단순한 공장이 있습니다.
myApp.factory('MyFactory', ['$http',function($http) {
var people = {
requestPeople: function(x) {
var url = 'js/test.json';
return $http.get(url);
}
};
return people;
}]);
컨트롤러에서는 이렇게 부릅니다.
myApp.controller('MyCtrl1', ['$scope', 'MyFactory', function ($scope, MyFactory) {
MyFactory.requestPeople(22).then(function(result) {
$scope.peopleList = result;
});
}]);
잘 작동하는 동안, 저는 이 문제를 조롱할 수 있기를 바랍니다.result
이 경우 통과됩니다.then
호출됩니다.이게 가능합니까?
지금까지의 나의 시도는 아무 것도 만들어내지 못했다.제 시도는 이렇습니다.
//Fake service
var mockService = {
requestPeople: function () {
return {
then: function () {
return {"one":"three"};
}
}
}
};
//Some setup
beforeEach(module('myApp.controllers'));
var ctrl, scope;
beforeEach(inject(function ($rootScope, $controller) {
scope = $rootScope.$new();
ctrl = $controller('MyCtrl1', { $scope: scope, MyFactory: mockService });
}));
//Test
it('Event Types Empty should default to false', inject(function () {
expect(scope.peopleList.one).toBe('three');
}));
카르마 러너에서 실행할 때 발생하는 오류는
TypeError: 'undefined'는 개체가 아닙니다('scope' 평가).people List.one')
시뮬레이션된 데이터로 이 테스트를 수행하려면 어떻게 해야 합니까?
$httpBackend가 당신이 원하는 게 아닌 것 같은데 $http에 의존하지 않고 공장 전체가 조롱당하기를 원하십니까?
$q, 특히 Testing 헤더 아래의 코드샘플을 참조하십시오.다음과 같은 코드로 문제를 해결할 수 있습니다.
'use strict';
describe('mocking the factory response', function () {
beforeEach(module('myApp.controllers'));
var scope, fakeFactory, controller, q, deferred;
//Prepare the fake factory
beforeEach(function () {
fakeFactory = {
requestPeople: function () {
deferred = q.defer();
// Place the fake return object here
deferred.resolve({ "one": "three" });
return deferred.promise;
}
};
spyOn(fakeFactory, 'requestPeople').andCallThrough();
});
//Inject fake factory into controller
beforeEach(inject(function ($rootScope, $controller, $q) {
scope = $rootScope.$new();
q = $q;
controller = $controller('MyCtrl1', { $scope: scope, MyFactory: fakeFactory });
}));
it('The peopleList object is not defined yet', function () {
// Before $apply is called the promise hasn't resolved
expect(scope.peopleList).not.toBeDefined();
});
it('Applying the scope causes it to be defined', function () {
// This propagates the changes to the models
// This happens itself when you're on a web page, but not in a unit test framework
scope.$apply();
expect(scope.peopleList).toBeDefined();
});
it('Ensure that the method was invoked', function () {
scope.$apply();
expect(fakeFactory.requestPeople).toHaveBeenCalled();
});
it('Check the value returned', function () {
scope.$apply();
expect(scope.peopleList).toBe({ "one": "three" });
});
});
$apply의 기능에 대한 테스트를 추가했는데, 이걸 가지고 놀기 전까지는 몰랐어요!
고그
언급URL : https://stackoverflow.com/questions/17825798/how-do-i-mock-the-result-in-a-http-get-promise-when-testing-my-angularjs-contro
반응형
'programing' 카테고리의 다른 글
Oracle ODP.net Managed 드라이버와 Unmanaged 드라이버 (0) | 2023.02.25 |
---|---|
PL/SQL 및 SQL에서 VARCHAR2의 최대 크기는 얼마입니까? (0) | 2023.02.25 |
Google Analytics에 의하면, 제 방문자의 대부분은 social-buttons.com입니다.이 방문자들은 내 사이트를 어떻게 찾나요? (0) | 2023.02.25 |
기능 컴포넌트를 "순수"로 선언합니다. (0) | 2023.02.25 |
Angular JS의 사용자 정의 함수를 어디에 배치할 수 있습니까? (0) | 2023.02.25 |