Модульное тестирование нескольких вызовов одной и той же функции с разными аргументами angularjs / jasmine - PullRequest
0 голосов
/ 30 апреля 2018

Я пытаюсь протестировать подобный кусок кода.

Когда я получаю 409, он меняет аргумент и снова вызывает ту же функцию.

function testSomething(stuff) {
  console.log(stuff);
  return customService.doSomething().then(function() {
    return customService.doSomethingElse().then(function(something) {
      //do something here
      return $q.resolve(something);
    });
  }, function(error) {
    if(error.status === 409) {
      //change stuff
      //something like stuff = newStuff;
      testSomething(stuff);
    }
  });
}

Поэтому я пытаюсь проверить аргументы функции, когда она вызывается 1-й и 2-й раз. Но когда аргументы для второго вызова отображаются неопределенными. А также не удается подтвердить asHaveBeenCallTimes 2.

it('should handle 409', function() {
  spyOn(customService, 'doSomething').and.returnValue($q.reject({
    status: 409
  }));
  spyOn(someService, 'testSomething').and.callThrough();
  
  someService.testSomething(stuff);
  $scope.$apply();

  expect(someService.testSomething.calls.argsFor[0]).toEqual([stuff]);
  expect(customService.doSomething).toHaveBeenCalled();
  expect(someService.testSomething.calls.argsFor[1]).toEqual([newStuff]);
  expect(someService.testSomething).toHaveBeenCalledTimes(2);
});

Хотя я вижу, как console.log (вещи) регистрируется 2 раза в консоли с правильными аргументами.

1 Ответ

0 голосов
/ 30 апреля 2018

Полагаю, ваши шпионы просто перезаписывают друг друга. Вы можете сделать это так:

spyOn(customService, 'doSomething').and.returnValue($q.reject({
    status: 409
  }));
  someService.testSomething(stuff);
  // now doSomething is called and $q.reject is retuend
  expect(someService.testSomething.calls.argsFor[0]).toEqual([stuff]);      

  spyOn(customService, 'doSomething').and.returnValue($q.when());
  $scope.$apply();

Или вот так, что мне нравится больше:

var index = 0;

spyOn(customService, 'doSomething').and.callFake(() => {
  index++;
  return index === 1 ? $q.reject({status: 409}) : $q.when();
});
...