Jelaskan bugnya
createStubInstance
mengabaikan properti sendiri dan, pada kelas super, buta terhadap metode dan properti yang diwarisinya
Untuk Mereproduksi
class SubTest {
name;
constructor({ name }) { this.name = name }
something() {}
}
export default class SuperTest extends SubTest {
description;
constructor(...props) {
super(props);
this.description = props.description;
}
noop() {}
}
import sinon from 'sinon';
import SuperTest from './SuperTest.js';
sinon.createStubInstance(SuperTest, {
description: 'Lorem Ipsum',
name: 'Foobar',
noop() {},
something() {},
});
Error: Cannot stub description. Property does not exist!
at …/sinon/lib/sinon/stub.js:129:19
at Array.forEach (<anonymous>)
at stub.createStubInstance (…/sinon/lib/sinon/stub.js:120:5)
setelah berkomentar description: 'Lorem Ipsum',
:
Error: Cannot stub name. Property does not exist!
at …/sinon/lib/sinon/stub.js:129:19
at Array.forEach (<anonymous>)
at stub.createStubInstance (…/sinon/lib/sinon/stub.js:120:5)
setelah juga berkomentar name: 'Foobar',
:
Error: Cannot stub something. Property does not exist!
at …/sinon/lib/sinon/stub.js:129:19
at Array.forEach (<anonymous>)
at stub.createStubInstance (…/sinon/lib/sinon/stub.js:120:5)
Dengan hanya noop() {}
dalam penggantian, itu berfungsi.
Perilaku yang diharapkan
Saya berharap createStubInstance
untuk mematikan setiap/semua bidang yang ada di kelas yang disediakan.
Konteks (harap lengkapi informasi berikut):
EDIT : Saya awalnya terlalu menyederhanakan tes di atas dan menghilangkan super()
, tetapi itu tidak berpengaruh pada perilaku sinon. Tes di atas diperbaiki.
Terima kasih telah mengangkat ini. Ada beberapa hal yang salah atau disalahpahami di sini:
createStubInstance
tidak didokumentasikan (saya bahkan tidak menyadarinya ).Dokumentasi secara eksplisit menyatakan bahwa
Fungsi konstruktor yang diberikan tidak dipanggil.
Jadi asumsi yang dapat digunakan untuk melewatkan argumen awal tidak dapat bekerja.
{ something: sinon.stub() }
).{ something: 42 }
).Ini jelas membutuhkan dokumentasi yang lebih baik, tetapi ini bukan bug.
Bagaimana Anda dapat membuat use case Anda berfungsi:
Perhatikan bahwa Anda membuat objek baru dari prototipe "kelas". Anda tidak benar-benar membuat turunan dari kelas karena konstruktor tidak dipanggil. Pada dasarnya nilai kembalian createStubInstance
hanya memiliki antarmuka yang sama dengan kelas Anda dengan semua fungsi diganti dengan stub. Oleh karena itu, jika Anda memerlukan properti pada instance rintisan ini, Anda bisa menetapkannya.
Terima kasih untuk jawaban cepat Mu!
Perhatikan bahwa Anda membuat objek baru dari prototipe "kelas". Anda tidak benar-benar membuat turunan dari kelas karena konstruktor tidak dipanggil. Pada dasarnya nilai kembalian
createStubInstance
hanya memiliki antarmuka yang sama dengan kelas Anda dengan semua fungsi diganti dengan stub. Oleh karena itu, jika Anda memerlukan properti pada instance rintisan ini, Anda bisa menetapkannya.
Mungkinkah bermanfaat untuk mendukungnya di dalam createStubInstance?
function createStubInstance (…) {
// …
return Object.assign(stubbedInstance, propertyValuePairs); // anything it doesn't recognise
}
@jshado1 Tentu, kita bisa melakukan itu. Jika Anda tertarik dengan fitur ini, silakan kirim permintaan tarik