sinon.stub()を複数の.withArgsでチェーンすると、最後の宣言のみがスタブされます
var tabbedFunction = sinon.stub()。withArgs(argument1).returns(value1).withArgs(argument2).returns(value2);
次に、最後の宣言(.withArgs(argument2).returns(value2))のみが実際にスタブされます
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で実行しています
返事が遅れて申し訳ありません
@zurfyx上記と同じコードを使用して、前述の構成で複製を試みましたが、期待どおりにコンソールにsleepy
とeating
が出力されます。 なぜそれがあなたに問題を引き起こしているのかわからない😢
@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)
を最初の位置に置くだけで問題が解決します。
最も参考になるコメント
これはSinon1.7.3で正しく機能しています。