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.