Как проверить и разрешить обещание данных контроллера (.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');   
});
Другие вопросы по тегам