バグを説明する
createStubInstance
は自身のプロパティを無視し、スーパークラスでは、継承されたメソッドとプロパティを認識し
再現するには
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)
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)
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)
オーバーライドにnoop() {}
しかないので、機能します。
予想される行動
createStubInstance
は、提供されたクラスに存在するすべてのフィールドをスタブすることを期待しています。
コンテキスト(次の情報を入力してください):
編集:私はもともと上記のテストを過度に単純化し、 super()
を省略しましたが、シノンの動作には影響しませんでした。 上記のテストが修正されました。
これを持ってきてくれてありがとう。 ここには、間違っている、または誤解されていることがいくつかあります。
createStubInstance
の2番目の引数は文書化されていません(私はそれを認識していませんでした😄)。ドキュメントには、次のように明示されています
指定されたコンストラクター関数は呼び出されません。
したがって、最初の引数を渡すために使用できるという仮定は機能しません。
{ something: sinon.stub() }
)。{ something: 42 }
)。これには明らかにより良いドキュメントが必要ですが、バグではありません。
ユースケースを機能させる方法:
「クラス」プロトタイプから新しいオブジェクトを作成していることに注意してください。 コンストラクターが呼び出されないため、実際にはクラスのインスタンスを作成していません。 基本的に、 createStubInstance
の戻り値は、クラスと同じインターフェイスを持ち、すべての関数がスタブに置き換えられています。 したがって、このスタブインスタンスにプロパティが必要な場合は、それらを割り当てるだけです。
迅速な回答ありがとうございます!
「クラス」プロトタイプから新しいオブジェクトを作成していることに注意してください。 コンストラクターが呼び出されないため、実際にはクラスのインスタンスを作成していません。 基本的に、
createStubInstance
の戻り値は、クラスと同じインターフェイスを持ち、すべての関数がスタブに置き換えられています。 したがって、このスタブインスタンスにプロパティが必要な場合は、それらを割り当てるだけです。
createStubInstance内でそれをサポートする価値があるでしょうか?
function createStubInstance (…) {
// …
return Object.assign(stubbedInstance, propertyValuePairs); // anything it doesn't recognise
}
@ jshado1もちろん、それは可能です。 この機能に興味がある場合は、プルリクエストを送信してください🙂