Sinon: Merantai sinon.stub() dengan beberapa .withArgs hanya stub deklarasi terakhir

Dibuat pada 25 Sep 2012  ·  23Komentar  ·  Sumber: sinonjs/sinon

Merantai sinon.stub() dengan beberapa .withArgs hanya stub deklarasi terakhir

var stubbedFunction = sinon.stub().withArgs(argument1).returns(value1).withArgs(argument2).returns(value2);

maka hanya deklarasi terakhir (.withArgs(argument2).returns(value2)) yang benar-benar dimatikan

Komentar yang paling membantu

Ini bekerja dengan baik dengan Sinon 1.7.3:

var s = sinon.stub();
s.withArgs(1).returns('a');
s.withArgs(2).returns('b');
s(1); // -> 'a'
s(2); // -> 'b'
s(3) // -> undefined

Semua 23 komentar

Perlu membuat withArgs memodifikasi dan mengembalikan rintisan asli tempat ia dibuat, jika tersedia.

+1 Untuk ini. Pada catatan terkait, saya ingin withArgs secara opsional mengizinkan meneruskan ke metode asli untuk argumen yang tidak cocok.

Misalnya, jika saya ingin mematikan metode Node.js fs.readFileSync() , saya ingin Sinon mempertahankan implementasi asli sehingga require() (yang menggunakan readFileSync ) tidak rusak, tetapi gunakan metode stubbed untuk file tertentu untuk pengujian saya.

Contoh untuk komentar sebelumnya:

beforeEach(function() {
  global.fs = require('fs');
  sinon.stub(fs, 'readFileSync').onlyWithArgs('my-file.txt').returns('Contents of file');

  // Then require the module under test, which uses fs.readFileSync() internally
  // require() uses original method with correct calling context
  global.myModule = require('../src/my-module');
});

afterEach(function() {
  fs.readFileSync.restore();
});

it('does something with the file', function() {
  expect(myModule.loadFromFile()).toEqual('Contents of file');
});

Saya ingin menyarankan bahwa @froots posting di atas diposting di suatu tempat di dokumen. Saya mencari lama sebelum saya menemukan solusi ini tentang cara mengejek file yang menyertakan dependensi lain melalui require

Ide bagus. Ingin menusuknya? http://github.com/cjohansen/sinon-web/

Ini bekerja dengan baik dengan Sinon 1.7.3:

var s = sinon.stub();
s.withArgs(1).returns('a');
s.withArgs(2).returns('b');
s(1); // -> 'a'
s(2); // -> 'b'
s(3) // -> undefined

Saya rasa itu bukan contoh yang berfungsi, karena masih tidak berantai (Anda harus menggunakan rintisan/tiruan asli).

Benar. Tapi itu cukup bagus dan menjelaskan apa yang terjadi. Chaining meninggalkan ruang untuk interpretasi.

Saya setuju dengan @mantoni. Tujuan rintisan adalah untuk menunjukkan respons kontraktual dari layanan/kueri. Gaya ini mengekspresikannya dengan lebih baik.

Saya pikir dokumen mungkin dapat ditingkatkan di sini.

Saya mengharapkan yang berikut ini berfungsi:

var someObj = {
    someProp: sinon.stub().withArgs("foo").returns(true)
}

Itu jelas tidak berfungsi sebagaimana dimaksud. Tapi, yang lebih penting, itu tidak gagal dengan benar. Alih-alih someObj.someProp gagal mengembalikan true ketika foo tidak diberikan, itu selalu mengembalikan true . Karena klausa returns mengembalikan instance Behavior, someObj.someProp dengan patuh mengembalikan true terlepas dari input.

Saya memahami alasan di balik struktur rantai yang mengembalikan berbagai jenis objek. Tetapi pengguna disesatkan tentang apa objek yang dikembalikan itu. Karena metode yang diekspos CallObjects dan Behaviors cocok dengan API yang disediakan oleh Stubs, mudah untuk melihat mengapa orang akan menganggap mereka _adalah_ stub.

Saya setuju dengan @jasonkarns. Saya baru saja jatuh ke dalam "perangkap" yang sama: menyejajarkan deklarasi rintisan tidak mengembalikan contoh rintisan yang diharapkan. Namun, chaining tampaknya berfungsi seperti yang diharapkan saat menggunakan tiruan:

var someObj = {
    someProp: sinon.mock().withArgs("foo").returns(true)
}

Apakah ada alasan untuk ini?

Tidak yakin apakah saya melewatkan sesuatu, tetapi apakah poin @froots memungkinkan sekarang? Harus melakukan ini:

sinon.stub(fs, 'readdirSync', (dir) => {
    if (dir === 'foo-path') {
        return [
            'my.js',
            'fake.js',
            'stuff.js'
        ];
    }

    return fsReaddir(dir);
});

Ingin melakukan sesuatu seperti:

var myStub = sinon.stub(fs, 'readdirSync', fs.readdirSync);

myStub
    .withArgs('foo-path')
    .returns([
        'my.js',
        'fake.js',
        'stuff.js'
    ]);

Saya pikir ini sudah diperbaiki sekarang, contoh di bawah ini berfungsi sebagaimana dimaksud dengan [email protected]

var Dummy = {
    doSomething: function(something) {
        return 'doing ...' + something;
    }
}

sinon.stub(Dummy, 'doSomething')
    .withArgs('sleep').returns('sleepy')
    .withArgs('eat').returns('eating');

console.log(Dummy.doSomething('sleep'));
console.log(Dummy.doSomething('eat'));

@valentin-radulescu-hs masih gagal di pihak saya dengan 1.17.7 .
Masih membutuhkan returns terbaru sebagai satu-satunya nilai pengembalian, terlepas dari withArgs (seperti yang ditunjukkan oleh @jasonkarns https://github.com/sinonjs/sinon/issues/176#issuecomment- 78191790).

Apa yang berhasil bagi saya adalah jawaban @mantoni https://github.com/sinonjs/sinon/issues/176#issuecomment -33636496, dengan tidak merantai withArgs() .

var s = sinon.stub();
s.withArgs(1).returns('a');
s.withArgs(2).returns('b');

@zurfyx apakah Anda berjalan di node atau di browser? Versi node/browser mana yang Anda gunakan? Tidak yakin apakah itu penting tetapi saya ingin mencoba dan meniru di pihak saya.

Hai @valentin-radulescu-hs. Saya menjalankannya di Node, menggunakan babel-cli 6.22.2

  • simpul 6.9.4
  • NPM 3.10.10

maaf atas keterlambatan balasannya

@zurfyx Saya sudah mencoba mereplikasi dengan konfigurasi yang Anda sebutkan menggunakan kode yang sama seperti yang saya tulis di atas dan hasilnya ke konsol sleepy dan eating seperti yang diharapkan. Tidak yakin mengapa itu menyebabkan Anda bermasalah

@zurfyx Hanya untuk _totally_ yakin, sudahkah Anda mencoba ini?

grep version node_modules/sinon/package.json
rm -r node_modules
rm npm-shrinkwrap
npm install
grep version node_modules/sinon/package.json

Sering kali saya mengalami masalah karena versi paket yang saya harapkan tidak sama dengan yang diinstal.

@fatso83 Tidak berfungsi juga. grep versi keluaran masih 1.1.7.7 .

Ini adalah tes lengkap saya, jika ini dapat membantu:

  it('test', () => {
    const s = sinon.stub();
    s.withArgs('a').returns('1');
    s.withArgs('b').returns('2');

    console.info(s('c'));
  });

s('a') : '1'
s('b') : '2'
s('c') : undefined

  it('test', () => {
    const s = sinon.stub()
      .withArgs('a').returns('1')
      .withArgs('b').returns('2');

    console.info(s('c'));
  });

s('a') : '2'
s('b') : '2'
s('c') : '2'

Saya dapat mereproduksi perilaku ini dengan menggunakan sinon.createStubInstance juga.

const stub = sandbox.stub();
      const myObj = function(){};
      const objOne = sinon.createStubInstance(myObj);
      const objTwo = sinon.createStubInstance(myObj);
      stub.withArgs(objOne).returns('1');
      stub.withArgs(objTwo).returns('2');

      console.info(stub(objOne));
      console.info(stub(objTwo));

Keluaran:
2 2

Saya pikir sinon.createStubInstance seharusnya membuat objek rintisan baru. Apakah itu salah?

Saya tidak sepenuhnya yakin apakah pertanyaan ini milik utas ini, tetapi pasti ada hubungannya dengan itu. Dalam sebuah proyek dengan sinon 1.17.7 saya biasa menghubungkan beberapa pernyataan withArgs , di mana yang terakhir adalah matcher "ambil semua" yang bertindak sebagai default. Sebagai contoh:

const s = sinon.stub();
s.withArgs(1).returns(1)
 .withArgs(2).returns(2)
 .withArgs(sinon.match.any).returns('my-default-value')

s(1) // 1
s(5) // my-default-value

Sekarang saya menggunakan 4.1.3 dan perilakunya berubah, selalu mengembalikan my-default-value . Apakah ini dimaksudkan? Jika demikian, apakah ada cara untuk mendefinisikan nilai default/fallback dalam rantai withArgs ?

Saya tidak berpikir perubahan itu pernah dimaksudkan. Jika Anda dapat memberikan perbaikan untuk
regresi merasa bebas! Saya dapat membantu melacak di mana itu terjadi menggunakan got
menyalahkan.

Manusia sarang. 15. Januari 2018, 11.13 skrev David García [email protected] :

Saya tidak sepenuhnya yakin apakah pertanyaan ini milik utas ini, tetapi itu
pasti ada hubungannya. Dalam sebuah proyek dengan sinon 1.17.7 I
digunakan untuk menghubungkan beberapa pernyataan withArgs, di mana yang terakhir adalah a
matcher "ambil-semua" yang bertindak sebagai default. Sebagai contoh:

const s = sinon.stub();s.withArgs(1).returns(1)
.withArgs(2).returns(2)
.withArgs(sinon.match.any).returns('nilai-default-saya')
s(1) // 1s(5) // nilai default-saya

Sekarang saya menggunakan 4.1.3 dan perilakunya berubah, selalu kembali
nilai-default saya. Apakah ini dimaksudkan? Jika demikian, apakah ada cara untuk mendefinisikan a
nilai default/fallback dalam rantai withArgs?


Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung, lihat di GitHub
https://github.com/sinonjs/sinon/issues/176#issuecomment-357638653 , atau bisukan
benang
https://github.com/notifications/unsubscribe-auth/AAluXMzqALJ0JlAM3hUaiK1SSyca9H74ks5tKyS4gaJpZM4AK2eu
.

>

[gambar: --]

Carl-Erik Kopseng
[gambar: https://]about.me/kopseng
https://about.me/kopseng?promo=email_sig&utm_source=email_sig&utm_medium=email_sig&utm_campaign=external_links

@fatso83 Saya telah mempersempitnya, dan ternyata itu sengaja . Bagi saya, rasanya lebih alami menentukan fallback di pernyataan withArgs terakhir, meskipun dalam kasus ini hanya mengganti urutan dan menempatkan .withArgs(sinon.match.any) di posisi pertama menyelesaikan masalah

Apakah halaman ini membantu?
0 / 5 - 0 peringkat