Bir Jasmine casusundaki birden fazla çağrı için farklı dönüş değerlerine sahip olma


103

Bunun gibi bir yöntemi gözetlediğimi söyle:

spyOn(util, "foo").andReturn(true);

Test edilen işlev util.foobirden çok kez çağırır .

Casusun trueilk çağrıldığında geri dönmesi, ancak falseikinci kez geri gelmesi mümkün mü? Yoksa bunu yapmanın farklı bir yolu var mı?

Yanıtlar:


170

Sen kullanabilirsiniz spy.and.returnValues (Jasmine 2.4 gibi).

Örneğin

describe("A spy, when configured to fake a series of return values", function() {
  beforeEach(function() {
    spyOn(util, "foo").and.returnValues(true, false);
  });

  it("when called multiple times returns the requested values in order", function() {
    expect(util.foo()).toBeTruthy();
    expect(util.foo()).toBeFalsy();
    expect(util.foo()).toBeUndefined();
  });
});

Dikkat etmeniz gereken bir şey var, benzer bir işlev returnValueolmadan büyülüyor s, onu kullanırsanız yasemin sizi uyarmayacaktır.


22
+1: bu mükemmel bir özellik. Bununla birlikte, bir uyarı kelimesi - 's' içindeki 's' yi unutmamaya dikkat edin .returnValues- iki işlev açıkça farklıdır, ancak birden çok argüman iletmek .returnValuehata vermez. O karakter yüzünden ne kadar zaman kaybettiğimi kabul etmek istemiyorum.
The DIMM Reaper

@TheDIMMReaper, Teşekkürler. Şimdi bahsediyorum.
Okyanus

Her şey benim için önemliydi, testte değil (o)
Ian

Elbette TypeScript'te yasemin kullanırken yazım hataları konusunda endişelenmenize gerek yok.
Warlike Chimpanzee

27

Jasmine'in eski sürümleri spy.andCallFakeiçin Jasmine 1.3 veya spy.and.callFakeJasmine 2.0 için kullanabilirsiniz ve 'çağrılan' durumu basit bir kapatma veya nesne özelliği vb. Aracılığıyla izlemeniz gerekir.

var alreadyCalled = false;
spyOn(util, "foo").andCallFake(function() {
    if (alreadyCalled) return false;
    alreadyCalled = true;
    return true;
});

4
Bunu şu şekilde 2'den fazla çağrı için uzatabiliriz: var results = [true, false, "foo"]; var callCount = 0; spyOn (util, "foo"). ve.callFake (function () {sonuçları döndür [callCount ++];});
Jack

1
Bu, aşağıdaki gibi genel bir işleve genişletilebilir: function returnValues ​​() {var args = arguments; var callCount = 0; dönüş işlevi () {dönüş değişkenleri [callCount ++]; }; }
Tomas Lieberkind

Yalnızca results.shift () döndürebileceğiniz halde bu kodu neden tamamlayasınız?
ThaFog


Bu seçenek daha esnektir çünkü çağrı sırasına göre hata veya dönüş değeri atabiliriz.
0bj3ct
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.