it-swarm.com.de

Gibt es eine Möglichkeit, Jasmin-Spione anhand von Argumenten zu ändern?

Ich möchte eine Funktion testen, die eine externe API-Methode zweimal mit verschiedenen Parametern aufruft. Ich möchte diese externe API mit einem Jasmin-Spion verspotten und basierend auf den Parametern verschiedene Dinge zurückgeben. Gibt es eine Möglichkeit, dies in Jasmine zu tun? Das Beste, was ich mir einfallen lassen kann, ist ein Hack mit 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;
      }
    });
  });
});
119
Jmr

In Jasmine-Versionen 3.0 und höher können Sie withArgs verwenden.

describe('my fn', function() {
  it('gets user name and ID', function() {
    spyOn(externalApi, 'get')
      .withArgs('abc').and.returnValue('Jane')
      .withArgs('123').and.returnValue(98765);
  });
});

Für Jasmine-Versionen vor 3.0 ist callFake der richtige Weg, aber Sie können ihn vereinfachen, indem Sie ein Objekt zum Speichern der Rückgabewerte verwenden

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]
    });
  });
});

Je nach Jasmine-Version unterscheidet sich die Syntax geringfügig:

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

Ressourcen:

168

Sie könnten auch $provide, um einen Spion zu erstellen. Und verspotten mit and.returnValues anstatt and.returnValue zur Übergabe parametrierter Daten.

Gemäß Jasmine docs: Durch Verketten des Spions mit and.returnValues, alle Aufrufe der Funktion geben bestimmte Werte in der angegebenen Reihenfolge zurück, bis das Ende der Liste der zurückgegebenen Werte erreicht ist. An diesem Punkt wird sie für alle nachfolgenden Aufrufe undefiniert zurückgegeben.

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                
        }));
});
7
akhouri