Sinon: createStubInstance tidak mematikan properti sendiri atau apa pun yang diwarisi

Dibuat pada 23 Jan 2021  ·  3Komentar  ·  Sumber: sinonjs/sinon

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):

  • Versi perpustakaan: [email protected]
  • Lingkungan:
    macOS 11.1
    simpul 15.6.0
    npm 7.4
  • Pustaka lain yang Anda gunakan:
    chai 4.2.0
    sinon-chai 3.5.0

EDIT : Saya awalnya terlalu menyederhanakan tes di atas dan menghilangkan super() , tetapi itu tidak berpengaruh pada perilaku sinon. Tes di atas diperbaiki.

Easy Documentation Help wanted

Semua 3 komentar

Terima kasih telah mengangkat ini. Ada beberapa hal yang salah atau disalahpahami di sini:

  • Argumen kedua pada 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.

  • Implementasi yang ada dari fitur tidak berdokumen ini melakukan ini:

    • Melempar jika properti tidak dapat ditimpa karena tidak ada pada instance stub . Inilah yang terjadi dalam kasus Anda. Konstruktor belum dipanggil dan oleh karena itu properti "anggota" Anda tidak ada.

    • Jika override yang diberikan adalah stub, ganti stub default dengan yang diberikan (misalnya { something: sinon.stub() } ).

    • Jika tidak, buat rintisan default mengembalikan nilai properti yang diberikan (misalnya { 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

Apakah halaman ini membantu?
0 / 5 - 0 peringkat