Sinon: sinon.stub()を複数の.withArgsでチェーンすると、最後の宣言のみがスタブされます

作成日 2012年09月25日  ·  23コメント  ·  ソース: sinonjs/sinon

sinon.stub()を複数の.withArgsでチェーンすると、最後の宣言のみがスタブされます

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

次に、最後の宣言(.withArgs(argument2).returns(value2))のみが実際にスタブされます

最も参考になるコメント

これはSinon1.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

全てのコメント23件

withArgsを変更して、作成元の元のスタブが利用可能な場合はそれを返す必要があります。

+1このために。 関連するメモとして、 withArgsで、一致しない引数に対してオプションで元のメソッドへのパススルーを許可したいと思います。

たとえば、Node.jsのfs.readFileSync()メソッドをスタブ化する場合、 require()readFileSyncを使用)が壊れないように、Sinonに元の実装を保持させます。ただし、テストでは特定のファイルにスタブメソッドを使用します。

前のコメントの例:

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');
});

上記の投稿の@frootsがドキュメントのどこかに投稿されていることをお勧めします。 requireを介して他の依存関係を含むファイルをモックする方法についてこの解決策を見つける前に、私は長い間検索しました

良いアイデア。 それを突き刺したいですか? http://github.com/cjohansen/sinon-web/

これはSinon1.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

それはまだチェーンされていないので、それが機能している例ではないと思います(元のスタブ/モックを使用する必要があります)。

本当です。 しかし、それで十分であり、何が起こっているのかが明確になります。 連鎖は解釈の余地を残します。

@mantoniに同意します。 スタブの目的は、サービス/クエリの契約上の応答を示すことです。 このスタイルはそれをよりよく表現します。

ドキュメントはおそらくここで改善できると思います。

私は次のことが機能することを期待していました:

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

明らかに意図したとおりに機能しませんでした。 しかし、もっと重要なことに、それは正しく失敗しませんでした。 fooが指定されていない場合にsomeObj.somePropがtrueを返さない代わりに、常にtrueを返します。 returns句はBehaviorインスタンスを返すため、 someObj.somePropは入力に関係なくtrue $を忠実に返します。

さまざまなタイプのオブジェクトを返す連鎖構造の背後にある理論的根拠を理解しています。 しかし、ユーザーはそれらの返されたオブジェクトが何であるかについて誤解されています。 CallObjectsとBehaviorsが公開するメソッドはStubsによって提供されるAPIと一致するため、それらがスタブであると想定する理由を簡単に理解できます。

@jasonkarnsに同意します。 私はちょうど同じ「罠」に陥りました。スタブ宣言をインライン化しても、期待されるスタブインスタンスは返されません。 ただし、モックを使用すると、チェーンは期待どおりに機能するように見えます。

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

これには何か理由がありますか?

何かが足りないかどうかはわかりませんが、 @ frootsポイントは可能ですか? これをしなければならなかった:

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

    return fsReaddir(dir);
});

次のようなことをしたかった:

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

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

これは現在修正されていると思います。以下の例は[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それでも1.17.7で私の側で失敗します。
withArgsに関係なく、最新のreturnsが唯一の戻り値として使用されます( @jasonkarns https://github.com/sinonjs/sinon/issues/176#issuecomment-が指摘) 78191790)。

私にとってうまくいくのは、 withArgs()をチェーンしないことによる、@ mantoniの回答https://github.com/sinonjs/sinon/issues/176#issuecomment-33636496です。

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

@zurfyxはノードまたはブラウザで実行していますか? どのバージョンのノード/ブラウザを使用していますか? それが重要かどうかはわかりませんが、私は自分の側で複製してみたいと思います。

ねえ@ valentin-radulescu-hs。 babel-cli 6.22.2を使用して、Nodeで実行しています

  • ノード6.9.4
  • NPM 3.10.10

返事が遅れて申し訳ありません

@zurfyx上記と同じコードを使用して、前述の構成で複製を試みましたが、期待どおりにコンソールにsleepyeatingが出力されます。 なぜそれがあなたに問題を引き起こしているのかわからない😢

@zurfyx念のため、これを試しましたか?

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

ほとんどの場合、問題が発生するのは、インストールされているものと同じではないと予想しているパッケージバージョンが原因です。

@ fatso83どちらも機能しません。 grep出力バージョンはまだ1.1.7.7です。

これは私の完全なテストです、それが役立つ場合に備えて:

  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'

sinon.createStubInstanceを使用しても、この動作を再現できます。

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

出力:
2 2

sinon.createStubInstanceが新しいスタブオブジェクトを作成することになっていると思いました。 それは間違っていますか?

この質問がこのスレッドに属しているかどうかは完全にはわかりませんが、それは間違いなくそれと関係があります。 sinon 1.17.7を使用するプロジェクトでは、いくつかのwithArgsステートメントをチェーンするために使用しました。最後のステートメントは、デフォルトとして機能する「グラブオール」マッチャーでした。 例えば:

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

現在、 4.1.3を使用していますが、動作が変更され、常にmy-default-valueが返されます。 これは意図されたものですか? もしそうなら、 withArgsのチェーンでデフォルト/フォールバック値を定義する方法はありますか?

変更が意図されていたとは思いません。 修正を提供できる場合
回帰はお気軽に! gotを使用して発生した場所を追跡するのに役立ちます
避難。

デンマン。 15. 1月。 2018、11.13skrevDavidGarcíanotifications @ github.com:

この質問がこのスレッドに属しているかどうかは完全にはわかりませんが、
間違いなくそれと関係があります。 sinon1.17.7を使用したプロジェクトでは
いくつかのwithArgsステートメントをチェーンするために使用され、最後のステートメントは
デフォルトとして機能した「grab-all」マッチャー。 例えば:

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

今私は4.1.3を使用していて、動作が変更されました、それは常に戻ります
my-default-value。 これは意図されたものですか? もしそうなら、を定義する方法はありますか
withArgsのチェーンのデフォルト/フォールバック値?


あなたが言及されたので、あなたはこれを受け取っています。
このメールに直接返信し、GitHubで表示してください
https://github.com/sinonjs/sinon/issues/176#issuecomment-357638653 、またはミュート
スレッド
https://github.com/notifications/unsubscribe-auth/AAluXMzqALJ0JlAM3hUaiK1SSyca9H74ks5tKyS4gaJpZM4AK2eu

>>

[画像: - ]

カール・エリック・コプセン
[画像:https://] about.me/kopseng
https://about.me/kopseng?promo=email_sig&utm_source=email_sig&utm_medium=email_sig&utm_campaign=external_links

@ fatso83絞り込んだのですが、どうやらわざとでした。 私には、最後のwithArgsステートメントでフォールバックを指定する方が自然に感じますが、この場合は、順序を切り替えて.withArgs(sinon.match.any)を最初の位置に置くだけで問題が解決します。

このページは役に立ちましたか?
0 / 5 - 0 評価