Любой способ модифицировать шпионов Jasmine на основе аргументов?

У меня есть функция, которую я бы хотел проверить, которая дважды вызывает внешний API-интерфейс, используя разные параметры. Я хотел бы высмеять этот внешний API с помощью шпиона Jasmine и вернуть разные вещи на основе параметров. Есть ли способ сделать это в Жасмине? Лучшее, что я могу придумать, это взлом с использованием andCallFake:

var functionToTest = function() {
  var userName = externalApi.get('abc');
  var userId = externalApi.get('123');
};


describe('my fn', function() {
  it('gets user name and ID', function() {
    spyOn(externalApi, 'get').andCallFake(function(myParam) {
      if (myParam == 'abc') {
        return 'Jane';
      } else if (myParam == '123') {
        return 98765;
      }
    });
  });
});

Ответ 1

callFake - это правильный путь, но вы можете упростить его, используя объект для хранения возвращаемых значений

describe('my fn', function() {
  var params = {
    'abc': 'Jane', 
    '123': 98765
  }

  it('gets user name and ID', function() {
    spyOn(externalApi, 'get').and.callFake(function(myParam) {
     return params[myParam]
    });
  });
});

В зависимости от версии Jasmine синтаксис несколько отличается:

  • 1.3.1: .andCallFake(fn)
  • 2.0: .and.callFake(fn)

Ресурсы:

Ответ 2

Вы также можете использовать $provide для создания шпиона. И макет с использованием and.returnValues вместо and.returnValue для передачи параметризованных данных.

В соответствии с документами Jasmine:. Связывая шпион с and.returnValues, все вызовы функции возвращают определенные значения до тех пор, пока они не дойдут до конца списка возвращаемых значений, после чего вернет undefined для всех последующих вызовов.

describe('my fn', () => {
    beforeEach(module($provide => {
        $provide.value('externalApi', jasmine.createSpyObj('externalApi', ['get']));
    }));

        it('get userName and Id', inject((externalApi) => {
            // Given
            externalApi.get.and.returnValues('abc','123');

            // When
            //insert your condition

            // Then
            // insert the expectation                
        }));
});