Как проверить и разрешить обещание данных контроллера (.then function()) и получить оригинальные данные в Jasmine2
I am testing a controller that uses a service that returns a promise. I need to resolve promise. I am using Jasmine 2.
Here is Spec code
beforeEach(inject(function ($controller, $rootScope, _myService_, _$q_, _$rootScope_, _$httpBackend_, $http) {
scope = $rootScope.$new();
$q = _$q_;
$httpBackend = _$httpBackend_;
$rootScope = _$rootScope_;
myService = _myService_;
$http = $http;
ctrl = $controller('Ctrl', { '$scope': scope, 'myService': myService });
spyOn(myService, "getDateRangeData").and.callThrough();
}));
it('getDateRangeData return Data obj', function() {
myService.getDateRangeData().then(function(response) {
console.log('Success', response);
});
scope.$digest()
});
service js
function getDateRangeData(obj) {
return $http({
method: 'POST',
url: 'https:URL',
headers: {
'Content-Type': 'application/json',
'X-Auth-Token': self.token
},
data: obj
})
}
консоль не возвращает obj.Shows error. Неожиданный запрос: POST https:URL Больше не ожидается запрос. Мне нужны данные от Ctrl . В Crtl я получаю данные, но не в testcase. отложить. как получить данные API. Данные API - это объект. или есть другой апрель, чтобы получить Ctrl, вернуть обещание и getData? добавлен сервисный js-код для отправки запроса.
может кто-нибудь помочь в ближайшее время, пожалуйста.
2 ответа
Если вы хотите, чтобы spyOn действительно использовал правильную реализацию вместо макета, вы можете использовать callThrough()
вместо callFake()
,
Попробуйте это так:
spyOn(myService, "getDateRangeData").and.callThrough();
Прежде всего, вы "шпионите" за неправильным методом. Мы используем spyOn
по двум причинам:
- к
expect(method).toHaveBeenCalled
- Издеваться
return value
В вашем случае spyOn
не достигает ни одного из этих двух.
Вам следует spyOn
$http
вместо. Поскольку фактический вызов http не требуется для вашего теста, причина в том, что целью является не тестирование $http
,
this.$http = $http;
spyOn(this, '$http').and.callFake(function(args) {
return {
then: function(fn) {
return fn('response');
}
};
});
И в it
блок:
it('getDateRangeData return Data obj', function() {
myService.getDateRangeData('test')
.then(function(response) {
console.log('Success', response);
expect(response).toEqual('response');
});
expect(this.$http).toHaveBeenCalledOnceWith('test');
});