Sinon: Rintisan bersyarat satu baris mengembalikan rintisan tanpa syarat

Dibuat pada 25 Agu 2015  ·  23Komentar  ·  Sumber: sinonjs/sinon

Ketika rintisan bersyarat diatur dalam satu baris (sehingga nilai yang dipertahankan oleh tes adalah apa pun yang dikembalikan oleh returns() ), maka rintisan itu sebenarnya _unconditional_, yang sangat mengejutkan dan hampir pasti salah .

Mengharapkan

Ketika saya melakukan ini dalam tes:

stub = sinon.stub().withArgs("foo").returns("bar")`

Saya berharap:

expect(stub("not foo")).toBe(undefined)

Tapi sebenarnya "bar" .

Solusi

Rupanya, apa yang telah dilakukan setiap pengguna Sinon sampai saat ini adalah:

stub = sinon.stub()
stub.withArgs("foo").returns("bar")`

Yang berperilaku seperti yang Anda harapkan, tetapi (IMHO) tidak perlu bertele-tele.

Catatan pedoman kontributor

  • Env: Mempengaruhi semua versi
  • Versi: 1.16.1
  • Caranya: Menggunakan konsol di beranda, menggunakan npm, menggunakan skrip unduhan
  • Lib lain: tidak
1.x Medium Help wanted Needs investigation stale

Semua 23 komentar

Ini mungkin menyelinap dengan pengubah withArgs . Saya setuju bahwa perilaku saat ini kurang optimal dan mungkin harus diubah. Namun, itu akan menjadi perubahan yang _sangat_ melanggar, dan kemungkinan tidak akan terjadi dalam waktu dekat.

Alasan untuk perilaku ini adalah sebagai berikut:

sinon.stub().withArgs("foo").returns("bar").withArgs("fooz").returns("ball")

Ini adalah ilustrasi yang bagus tentang jebakan API yang sangat dapat dirantai, dan dalam kasus ini, sayangnya Sinon memilih untuk mendukung IMO kasus yang salah.

Bagaimanapun, seperti yang saya katakan, terlalu banyak orang bergantung pada fungsi ini pada saat ini untuk memungkinkan kita "memperbaikinya", tetapi kita tentu harus mempertimbangkan untuk memperbaikinya dalam jangka panjang.

Saya memahami ketegangan dan menghargai keterusterangan Anda (setuju tetapi juga mendukung stabilitas).

Saya pikir dalam jangka pendek apa yang akan saya lakukan dengan proyek saya sendiri menggunakan Sinon.js adalah untuk membungkus API ini dengan fungsi yang mengonfigurasi kumpulan sempit ganda yang ingin saya lihat, yang akan mengatasi masalah ini.

Satu-satunya rekomendasi yang saya miliki untuk Anda sebagai pengelola mungkin adalah mempertimbangkan API alternatif untuk menyiapkan konfigurasi rintisan satu-dan-selesai.

Bisakah ini diatasi dalam benjolan versi utama? Saya memiliki banyak contoh dua baris ini di seluruh rangkaian pengujian saya yang saya lebih suka untuk membuat satu baris.

Dan saya akan memasukkan _kecurigaan_ saya bahwa ada lebih banyak orang yang lebih suka withArgs / returns untuk mengembalikan rintisan sempit daripada ada orang yang melakukan beberapa withArgs chaining. Saya rasa saya belum pernah melihat beberapa withArgs dalam satu rantai di alam liar, meskipun saya sering menemukan metode dua baris. [peringatan bias konfirmasi]

Jika kita dapat menemukan nama yang masuk akal untuk itu ( calledWithArgs ?), maka saya tidak dapat melihat mengapa kita tidak dapat memiliki kedua gaya tersebut di API. Menolak gaya lama demi gaya baru, tetapi biarkan hingga setidaknya versi utama berikutnya.

Memiliki kedua gaya akan membingungkan bagi pendatang baru, kecuali jika kami meningkatkan dokumentasi seputar fitur ini, yang mungkin sudah lama tertunda.

Selain: Saya setuju metode chaining sering menjadi penyebab sakit kepala. Sangat sulit untuk mengubah desain secara bertahap, ketika semuanya bergantung pada setiap detail kecil dari API yang sama. Karena kita sudah pergi sejauh ini ke lubang kelinci, sebaiknya kita terus berjalan ...

Hai @cjohansen setelah melihat contoh Anda sekali lagi:

stub = sinon.stub().withArgs("foo").returns("bar").withArgs("fooz").returns("ball")

Saya mencoba memasukkan ini untuk melihat apa yang akan dilakukannya:

stub() // => "ball"
stub("foo") // => "ball"
stub("fooz") // => "ball"

Siapa pun yang menggunakan rantai panjang seperti ini juga mungkin akan terkejut bahwa yang terakhir- returns -dalam-menang dan melakukannya tanpa mengenai withArgs , bukan?

Setelah melihat contoh ini, saya berjuang untuk membayangkan contoh seseorang yang mengandalkan rantai panjang seperti ini dan benar-benar menginginkan perilaku ini. Jika saya harus bertaruh, saya akan mengatakan perubahan ini akan mematahkan banyak tes menjadi lebih baik (karena saat ini positif palsu dari stub yang terlalu permisif)

Wah, itu menarik. Melihat ini saya bahkan tidak mengerti apa gunanya withArgs itu? :confused: Ini jelas merupakan argumen untuk membuat ini berperilaku dengan benar.

Terima kasih telah tetap berpikiran terbuka untuk @cjohansen itu, saya sangat menghargainya. Apa cara terbaik untuk melanjutkan dari sini? Apakah Anda akan terbuka untuk PR?

@searls yakin, PR akan bagus. Perilaku saat ini benar-benar rusak untuk rantai yang mendefinisikan lebih dari satu perilaku.

Keren! Saya akan menjadwalkan waktu untuk melihat ini minggu depan next

Rantai ini terkadang berfungsi:

findStub = sandbox.stub()
            findStub
                .withArgs(...)
               .returns(..)
              .withArgs(...)
               .returns(...)

Ini tidak berfungsi dengan baik :

findStub = sandbox.stub().withArgs(...)
               .returns(..)
              .withArgs(...)
               .returns(...)

@cjohansen Saya benar-benar minta maaf karena menjadi "orang itu" tetapi saya telah beralih dari menggunakan Sinon.js untuk proyek yang sedang saya kerjakan, jadi saya tidak akan menangani ini dengan PR saya sendiri. Jangan ragu untuk menutup/menurunkan prioritas sesuai dengan minat Anda sendiri, tentu saja.

@cjohansen Saya benar-benar minta maaf karena menjadi "orang itu" tetapi saya telah beralih dari menggunakan Sinon.js untuk proyek yang sedang saya kerjakan, jadi saya tidak akan menangani ini dengan PR saya sendiri. Jangan ragu untuk menutup/menurunkan prioritas sesuai dengan minat Anda sendiri, tentu saja.

Terima kasih telah membalas ini! Saya akan menerapkan label bantuan yang diinginkan, dan melihat apakah itu akan menarik perhatian seseorang dengan waktu untuk melihat lebih dalam tentang ini.

Juga, terima kasih atas penyelidikan Anda terhadap masalah ini!

pay4bugz ;-)

Wah. Ada properti pada stub yang dimodifikasi 'withArgs' yang disebut 'parent' yang merujuk kembali ke root stub.

Ketika saya melakukan rantai saya, saya hanya memberikan secara eksplisit bahwa saya ingin meneruskan kembali rantai itu.

var stubby = sinon.stub().throws()
.withArgs("foo").returns("bar").parent
.withArgs("foo2").returns("bar2").parent;

Bekerja cukup baik untuk saya. Khawatir perbaikan Anda akan menjadi perubahan besar bagi saya :(

@launchcg-ztonia Anda bergantung pada detail implementasi yang bukan bagian dari API resmi. Ini hampir pasti akan pecah di beberapa titik.

Di sini, saya ingin menegaskan bahwa fungsi panggilan balik dipanggil atau tidak. Jadi bagaimana saya bisa melakukannya menggunakan sinon js. Silakan menyarankan.

var send = function (templateId, callback) {

    const request = mailjet
        .post("send")
        .request(params)
    request
        .then((result) => {
            if (typeof callback === 'function') {
                callback(null, result.body);
            }

        })
        .catch((err) => {
            if (typeof callback === 'function') {
                callback(err, null);
            }
        })
    } else {
        callback(err, null);
    }
};

var mailjetClient = require('../../node_modules/node-mailjet/mailjet-client');

sinon.stub(mailjet, 'post').withArgs('send').returns(mailjetClient);
sinon.stub(mailjetClient, 'request').returns(Promise);
I am getting following error:

TypeError: Attempted to wrap undefined property request as function

@apoorva-shah: output javascript sudah cukup untuk membantu Anda. tidak ada properti yang disebut request untuk mematikan objek itu. dan tolong jangan gunakan pelacak masalah ini untuk pertanyaan penggunaan: coba stack overflow atau saluran Gitter kami.

Akan sangat bagus jika seseorang dapat meringkas hasil diskusi ini sebagai kasus uji yang gagal ditambahkan ke issues-test.js . Maka kita akan tahu jika kita tidak sengaja memperbaikinya ;)

Masalah ini secara otomatis ditandai sebagai basi karena tidak ada aktivitas terbaru. Ini akan ditutup jika tidak ada aktivitas lebih lanjut yang terjadi. Terima kasih atas kontribusi Anda.

Adakah kemungkinan ini akan dipertimbangkan kembali dalam rilis yang akan datang? Ini tampaknya masih menjadi masalah.

Adakah kemungkinan ini akan dipertimbangkan kembali dalam rilis yang akan datang?

Masalah ini telah ada selama bertahun-tahun, dan kami tidak melihat banyak daya tarik bagi siapa pun yang mencoba memperbaikinya. Ada kompleksitas yang cukup besar dalam api rintisan.

Saya telah mengerjakan API baru, yang jauh lebih sederhana #1586. Jika Anda penasaran, Anda bisa mencobanya dan meninggalkan umpan balik pada permintaan tarik itu.

@mantoni 2018, masih bekerja dengan baik :)

Apakah halaman ini membantu?
0 / 5 - 0 peringkat