nasıl

2014-11-12 3 views
42

Böyle bir yöntem üzerinde casusluk ediyorum Say casus bir Jasmine üzerinde birden aramalar için farklı dönüş değerlerine sahip.nasıl

Casusun ilk kez çağrıldığı casusun true olması ancak ikinci kez false döndürmesi mümkün mü? Ya da bunun için farklı bir yolu var mı?

cevap

67

Sen spy.and.returnValues (Jasmine 2.4 gibi) kullanabilirsiniz. ö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(); 
 
    }); 
 
});

hakkında dikkatli olmalı bazı şey yoktur, başka bir işlevi olduğunu kullanırsanız, yasemin uyarmak olmaz s olmadan benzer büyü returnValue orada olacaktır .

+0

Şimdi en iyi cevap bu. – mikhail

+8

+1: Bu mükemmel bir özellik. Yine de bir uyarı kelimesi - .returnValues' içindeki 's' 'i unutmamaya dikkat edin - iki işlev açıkça farklıdır, fakat birden fazla argümanı '.returnValue'ye aktarma bir hata atmaz. O karakter yüzünden ne kadar zaman harcadığımı itiraf etmek istemiyorum. –

+0

@ TheDIMMReaper, Teşekkürler. Şimdi anıyorum. – Ocean

16

Jasmine'in daha eski sürümleri için Jasmine 2.0 için spy.andCallFake veya Jasmine 2.0 için spy.and.callFake kullanabilirsiniz ve basit bir kapatma veya nesne özelliği vb. Aracılığıyla 'aranan' durumunu takip etmeniz gerekir.

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

Biz gibi 2 aramalar için bu uzatabilirsiniz , "foo"]; var callCount = 0; spyOn (kullananlar, "foo") ve.callFake (function() { sonuç döndürme [callCount ++]; }); – Jack

+1

Bu, aşağıdaki gibi bir genel işleve genişletilebilir: işlev dönüşüDeğerler() {var args = arguments; var callCount = 0; dönüş işlevi() {dönüş args [callCount ++]; }; } –

0

her da yerine beforeEach ait beforeAll kullanabilirsiniz çağrı için bir spec yazmak istiyorsanız: var sonuçları = [doğru, yanlış:

describe("A spy taking a different value in each spec", function() { 
    beforeAll(function() { 
    spyOn(util, "foo").and.returnValues(true, false); 
    }); 

    it("should be true in the first spec", function() { 
    expect(util.foo()).toBeTruthy(); 
    }); 

    it("should be false in the second", function() { 
    expect(util.foo()).toBeFalsy(); 
    }); 
}); 
+0

Testler birbirine bağlı olmamalıdır. – Ocean