2013-04-24 41 views
84

Farklı parametreler kullanarak, iki kez bir harici API yöntemini çağıran bir testi kullanmak istiyorum. Bu harici API'yi bir Jasmine casusuyla dalgalandırmak ve parametrelere göre farklı şeyler vermek istiyorum. Bunu Jasmine'de yapmanın bir yolu var mı? Ben ile gelip en iyi andCallFake kullanarak kesmek:Yasemin casuslarını argümanlara göre değiştirmenin herhangi bir yolu var mı?

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

cevap

112

callFake gitmek doğru yoldur, ancak dönüş bağlı

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

değerleri tutmak için bir nesne kullanarak kolaylaştırabilirsiniz yasemin versiyonu, yapı biraz daha farklıdır:

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

Kaynaklar: Ayrıca, bir casus oluşturmak için $provide kullanabilirsiniz

+9

Bu 'şimdi and.callFake' olduğunu - http://jasmine.github.io/2.2/introduction.html#section-Spies:_ farklı vaatlerde dönmek zorunda kaldı and.callFake

+0

, böylece dönüş biraz farklı görünüyordu: get q.when (params [myParam]) ;. Aksi halde, bu benim sorunumun çözümünde bir noktaydı. Hayalimdeki çözüm, "and.returnValue" çağrılarını değiştirmek olurdu. –

+5

, yasemin, bunu daha iyi açıklayabilmesi gerektiğini düşünüyor. "SpyOn (fake, 'method'). WithArgs ('abc'). Ve.returnValue ('Jane')' ve 'spyOn (sahte, 'method'). WithArgs ('123') ve .returnValue (98765) gibi.) '. – jrharshath

3

. Ve parametrelenmiş veri iletmek için and.returnValue yerine and.returnValues kullanarak alay edin. Yasemin docs gereğince

: Bu dönüş değerleri listesinin sonuna ulaşıncaya kadarand.returnValues ile casus zincirlerle bağlayarak, işleve tüm çağrılar, aynı tarihte için tanımsız dönecektir işaret sırayla belirli değerler dönecektir sonraki tüm çağrılar.

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     
     })); 
}); 
+0

Doğru bir cevaptır, çünkü bir test her zaman bir casusun nasıl çağrılacağını tam olarak bilmelidir ve bu nedenle birden fazla çağrıyı desteklemek için sadece 'returnValues ​​'kullanılmalıdır – Schmuli

İlgili konular