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.
https://github.com/jasmine/jasmine/blob/7f8f2b5e7a7af70d7f6b629331eb6fe0a7cb9279/src/core/requireInterface.js#L199
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();
valueA
aObservable
atauSubject
? Saya mendapatkanProperty valueA does not have access type get
Adakah alasan mengapa Anda tidak bisa langsung mengubahnya pada objek? Ini bukan seolah-olah javascript memaksakan visibilitas properti pada suatu objek.
sumber
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 baikspyOn
.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.
sumber
and.returnValue(1)
Cara terbaik adalah menggunakan
spyOnProperty
. Ini mengharapkan 3 parameter dan Anda harus lulusget
atauset
sebagai parameter ketiga.Contoh
Di sini saya menetapkan
get
dariclientWidth
daridiv.nativeElement
objek.sumber
Jika Anda menggunakan ES6 (Babel) atau TypeScript, Anda dapat menghentikan properti menggunakan get and set accessors
Kemudian dalam pengujian Anda, Anda dapat memeriksa bahwa properti disetel dengan:
sumber
Cara yang benar untuk melakukan ini adalah dengan memata-matai properti, ini akan memungkinkan Anda untuk mensimulasikan properti pada objek dengan nilai tertentu.
sumber
Misalkan ada metode seperti ini yang perlu diuji.
src
Properti gambar kecil perlu diperiksaSpyOn () 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
Ini untuk Jasmine 1.3 tetapi mungkin bekerja pada 2.0 jika "andCallFake" diubah menjadi nama 2.0
sumber
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:
Agak bertele-tele tapi itu berhasil
sumber
Saya agak terlambat ke pesta di sini saya tahu tapi,
Anda dapat langsung mengakses objek panggilan, yang dapat memberi Anda variabel untuk setiap panggilan
sumber
Anda tidak dapat meniru variabel tetapi Anda dapat membuat fungsi pengambil untuknya dan meniru metode itu dalam file spesifikasi Anda.
sumber