Yanıtlar:
Şubat 2017'de, Nisan 2017'de yayınladıkları bu özelliği ekleyerek bir PR birleştirdiler.
bu yüzden kullandığınız alıcılar / ayarlayıcılar hakkında casusluk yapmak için:
const spy = spyOnProperty(myObj, 'myGetterName', 'get');
myObj sizin örneğinizdir, 'myGetterName' sınıfınızda tanımlı olanın adıdır get myGetterName() {}
ve üçüncü param ise get
veya türüdür set
.
Oluşturulan casuslarla halihazırda kullandığınız iddiaların aynısını kullanabilirsiniz spyOn
.
Yani örneğin şunları yapabilirsiniz:
const spy = spyOnProperty(myObj, 'myGetterName', 'get'); // to stub and return nothing. Just spy and stub.
const spy = spyOnProperty(myObj, 'myGetterName', 'get').and.returnValue(1); // to stub and return 1 or any value as needed.
const spy = spyOnProperty(myObj, 'myGetterName', 'get').and.callThrough(); // Call the real thing.
İşte ilgileniyorsanız bu yöntemin kullanılabileceği github kaynak kodundaki satır.
Orijinal soruyu yasemin 2.6.1 ile yanıtlayarak, şunları yaparsınız:
const spy = spyOnProperty(myObj, 'valueA', 'get').andReturn(1);
expect(myObj.valueA).toBe(1);
expect(spy).toHaveBeenCalled();
Bunu doğrudan nesnede değiştirememenizin herhangi bir nedeni var mı? Javascript bir nesnede bir özelliğin görünürlüğünü zorunlu kılar gibi değildir.
spyOn
açık bir şekilde bir şeyle alay etmek istediğimi belirtirken, özelliği doğrudan örtük olarak ayarladığım bir şeyle alay etmek istediğimi belirtir ve başka birinin kodu okurken bir şeyle alay ettiğimi anlayacağından emin değilim. Diğer durum, nesnenin iç davranışını değiştirmek istemememdir, örneğin bir dizinin length özelliğini değiştirirsem, dizi kırpılır, bu nedenle bir taklit daha iyi olur
spyOn
.
spyOn
Özellik yoksa Jasmine testte başarısız olur.
TypeError: Cannot assign to read only property 'sessionStorage' of object '#<Window>'
Jasmine bu işleve sahip değil, ancak kullanarak birlikte bir şeyi hackleyebilirsiniz Object.defineProperty
.
Alıcı işlevi kullanmak için kodunuzu yeniden düzenleyebilir, ardından alıcıyı gözetleyebilirsiniz.
spyOn(myObj, 'getValueA').andReturn(1);
expect(myObj.getValueA()).toBe(1);
and.returnValue(1)
En iyi yol kullanmaktır spyOnProperty
. Bu 3 parametre bekler ve geçmek gerekir get
veya set
üçüncü bir param olarak.
const div = fixture.debugElement.query(By.css('.ellipsis-overflow'));
// now mock properties
spyOnProperty(div.nativeElement, 'clientWidth', 'get').and.returnValue(1400);
spyOnProperty(div.nativeElement, 'scrollWidth', 'get').and.returnValue(2400);
Burada kuruyorum get
ait clientWidth
bir div.nativeElement
nesne.
ES6 (Babel) veya TypeScript kullanıyorsanız get ve set erişimcileri kullanarak özelliği devre dışı bırakabilirsiniz.
export class SomeClassStub {
getValueA = jasmine.createSpy('getValueA');
setValueA = jasmine.createSpy('setValueA');
get valueA() { return this.getValueA(); }
set valueA(value) { this.setValueA(value); }
}
Daha sonra testinizde mülkün şunlarla ayarlanıp ayarlanmadığını kontrol edebilirsiniz:
stub.valueA = 'foo';
expect(stub.setValueA).toHaveBeenCalledWith('foo');
Bunu yapmanın doğru yolu, özellik üzerinde casusluk yapmaktır, belirli bir değere sahip bir nesne üzerinde bir özelliği simüle etmenize izin verecektir.
const spy = spyOnProperty(myObj, 'valueA').and.returnValue(1);
expect(myObj.valueA).toBe(1);
expect(spy).toHaveBeenCalled();
Bunun gibi test edilmesi gereken bir yöntem olduğunu varsayalım src
. Küçük görüntünün özelliğinin kontrol edilmesi gerekiyor
function reportABCEvent(cat, type, val) {
var i1 = new Image(1, 1);
var link = getABC('creosote');
link += "&category=" + String(cat);
link += "&event_type=" + String(type);
link += "&event_value=" + String(val);
i1.src = link;
}
Aşağıdaki spyOn (), "yeni Resmin" testteki sahte kodla beslenmesine neden olur, spyOn kodu yalnızca src özelliğine sahip bir nesne döndürür.
"Kanca" değişkeni, SpyOn'daki sahte kodda ve daha sonra "reportABCEvent" çağrıldıktan sonra görünür olacak şekilde kapsama dahil edildiğinden
describe("Alphabetic.ads", function() {
it("ABC events create an image request", function() {
var hook={};
spyOn(window, 'Image').andCallFake( function(x,y) {
hook={ src: {} }
return hook;
}
);
reportABCEvent('testa', 'testb', 'testc');
expect(hook.src).
toEqual('[zubzub]&arg1=testa&arg2=testb&event_value=testc');
});
Bu yasemin 1.3 içindir, ancak "andCallFake" 2.0 adıyla değiştirilirse 2.0'da da çalışabilir
Bir kendo ızgarası kullanıyorum ve bu nedenle uygulamayı bir alıcı yöntemine değiştiremiyorum, ancak bunun etrafında test etmek (ızgarayı alay etmek) ve ızgaranın kendisini test etmek istemiyorum. Bir casus nesnesi kullanıyordum ama bu özellik alay etmeyi desteklemiyor, bu yüzden şunu yapıyorum:
this.$scope.ticketsGrid = {
showColumn: jasmine.createSpy('showColumn'),
hideColumn: jasmine.createSpy('hideColumn'),
select: jasmine.createSpy('select'),
dataItem: jasmine.createSpy('dataItem'),
_data: []
}
Biraz uzun soluklu ama bir zevk veriyor
Buradaki partiye biraz geç kaldım biliyorum ama
Doğrudan çağrı nesnesine erişebilirsiniz, bu size her çağrı için değişkenleri verebilir
expect(spy.calls.argsFor(0)[0].value).toBe(expectedValue)
valueA
AObservable
veya ise bunu nasıl yaparımSubject
? Ben alıyorumProperty valueA does not have access type get