Jawaban:
Pada Februari 2017, mereka menggabungkan PR yang menambahkan fitur ini, mereka dirilis pada April 2017.
jadi untuk memata-matai getter / setter yang Anda gunakan: di
const spy = spyOnProperty(myObj, 'myGetterName', 'get');
mana myObj adalah instance Anda, 'myGetterName' adalah nama yang didefinisikan di kelas Anda sebagai get myGetterName() {}
dan parameter ketiga adalah tipe get
atau set
.
Anda dapat menggunakan pernyataan yang sama yang telah Anda gunakan dengan mata-mata yang dibuat dengan spyOn
.
Jadi Anda bisa misalnya:
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.
Berikut baris dalam kode sumber github tempat metode ini tersedia jika Anda tertarik.
Menjawab pertanyaan awal, dengan Jasmine 2.6.1, Anda akan:
const spy = spyOnProperty(myObj, 'valueA', 'get').andReturn(1);
expect(myObj.valueA).toBe(1);
expect(spy).toHaveBeenCalled();
Adakah alasan mengapa Anda tidak bisa langsung mengubahnya pada objek? Ini bukan seolah-olah javascript memaksakan visibilitas properti pada suatu objek.
spyOn
secara eksplisit menunjukkan bahwa saya ingin mengejek sesuatu, sementara saya secara langsung mengatur properti secara implisit menunjukkan bahwa saya ingin mengejek sesuatu, dan saya tidak yakin orang lain akan mengerti bahwa saya mengejek sesuatu ketika dia membaca kode. Kasus lainnya adalah saya tidak ingin mengubah perilaku bagian dalam objek, misalnya jika saya mengubah properti panjang untuk sebuah array, array tersebut dipangkas, jadi tiruan akan lebih baik
spyOn
.
spyOn
gagal dalam ujian jika propertinya tidak ada.
TypeError: Cannot assign to read only property 'sessionStorage' of object '#<Window>'
Jasmine tidak memiliki fungsi itu, tetapi Anda mungkin dapat meretas sesuatu bersama-sama menggunakan Object.defineProperty
.
Anda dapat memfaktorkan ulang kode Anda untuk menggunakan fungsi pengambil, lalu memata-matai pengambil.
spyOn(myObj, 'getValueA').andReturn(1);
expect(myObj.getValueA()).toBe(1);
and.returnValue(1)
Cara terbaik adalah menggunakan spyOnProperty
. Ini mengharapkan 3 parameter dan Anda harus lulus get
atau set
sebagai parameter ketiga.
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);
Di sini saya menetapkan get
dari clientWidth
dari div.nativeElement
objek.
Jika Anda menggunakan ES6 (Babel) atau TypeScript, Anda dapat menghentikan properti menggunakan get and set accessors
export class SomeClassStub {
getValueA = jasmine.createSpy('getValueA');
setValueA = jasmine.createSpy('setValueA');
get valueA() { return this.getValueA(); }
set valueA(value) { this.setValueA(value); }
}
Kemudian dalam pengujian Anda, Anda dapat memeriksa bahwa properti disetel dengan:
stub.valueA = 'foo';
expect(stub.setValueA).toHaveBeenCalledWith('foo');
Cara yang benar untuk melakukan ini adalah dengan memata-matai properti, ini akan memungkinkan Anda untuk mensimulasikan properti pada objek dengan nilai tertentu.
const spy = spyOnProperty(myObj, 'valueA').and.returnValue(1);
expect(myObj.valueA).toBe(1);
expect(spy).toHaveBeenCalled();
Misalkan ada metode seperti ini yang perlu diuji. src
Properti gambar kecil perlu diperiksa
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;
}
SpyOn () di bawah ini menyebabkan "Gambar baru" diberi kode palsu dari pengujian, kode spyOn mengembalikan objek yang hanya memiliki properti src
Karena variabel "hook" dicakup agar terlihat dalam kode palsu di SpyOn dan juga nanti setelah "reportABCEvent" dipanggil
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');
});
Ini untuk Jasmine 1.3 tetapi mungkin bekerja pada 2.0 jika "andCallFake" diubah menjadi nama 2.0
Saya menggunakan kendo grid dan karena itu tidak dapat mengubah implementasinya menjadi metode getter tetapi saya ingin menguji sekitar ini (mengejek grid) dan tidak menguji grid itu sendiri. Saya menggunakan objek mata-mata tetapi ini tidak mendukung properti mengejek jadi saya melakukan ini:
this.$scope.ticketsGrid = {
showColumn: jasmine.createSpy('showColumn'),
hideColumn: jasmine.createSpy('hideColumn'),
select: jasmine.createSpy('select'),
dataItem: jasmine.createSpy('dataItem'),
_data: []
}
Agak bertele-tele tapi itu berhasil
Saya agak terlambat ke pesta di sini saya tahu tapi,
Anda dapat langsung mengakses objek panggilan, yang dapat memberi Anda variabel untuk setiap panggilan
expect(spy.calls.argsFor(0)[0].value).toBe(expectedValue)
valueA
aObservable
atauSubject
? Saya mendapatkanProperty valueA does not have access type get