Sinon: createStubInstanceは、独自のプロパティや継承されたものをスタブしません

作成日 2021年01月23日  ·  3コメント  ·  ソース: sinonjs/sinon

バグを説明する
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は、提供されたクラスに存在するすべてのフィールドをスタブすることを期待しています。

コンテキスト(次の情報を入力してください):

  • ライブラリバージョン: [email protected]
  • 環境:
    macOS 11.1
    ノード15.6.0
    npm 7.4
  • 使用している他のライブラリ:
    チャイ4.2.0
    シノンチャイ3.5.0

編集:私はもともと上記のテストを過度に単純化し、 super()を省略しましたが、シノンの動作には影響しませんでした。 上記のテストが修正されました。

Easy Documentation Help wanted

全てのコメント3件

これを持ってきてくれてありがとう。 ここには、間違っている、または誤解されていることがいくつかあります。

  • createStubInstanceの2番目の引数は文書化されていません(私はそれを認識していませんでした😄)。
  • ドキュメントには、次のように明示されています

    指定されたコンストラクター関数は呼び出されません。

    したがって、最初の引数を渡すために使用できるという仮定は機能しません。

  • この文書化されていない機能の既存の実装はこれを行います:

    • プロパティがスタブインスタンスに存在しないためにオーバーライドできない場合に

    • 指定されたオーバーライドがスタブである場合は、デフォルトのスタブを指定されたスタブに置き換えます(例: { something: sinon.stub() } )。

    • それ以外の場合は、デフォルトのスタブが指定されたプロパティ値を返すようにします(例: { something: 42 } )。

これには明らかにより良いドキュメントが必要ですが、バグではありません。


ユースケースを機能させる方法:

「クラス」プロトタイプから新しいオブジェクトを作成していることに注意してください。 コンストラクターが呼び出されないため、実際にはクラスのインスタンスを作成していません。 基本的に、 createStubInstanceの戻り値は、クラスと同じインターフェイスを持ち、すべての関数がスタブに置き換えられています。 したがって、このスタブインスタンスにプロパティが必要な場合は、それらを割り当てるだけです。

迅速な回答ありがとうございます!

「クラス」プロトタイプから新しいオブジェクトを作成していることに注意してください。 コンストラクターが呼び出されないため、実際にはクラスのインスタンスを作成していません。 基本的に、 createStubInstanceの戻り値は、クラスと同じインターフェイスを持ち、すべての関数がスタブに置き換えられています。 したがって、このスタブインスタンスにプロパティが必要な場合は、それらを割り当てるだけです。

createStubInstance内でそれをサポートする価値があるでしょうか?

function createStubInstance (…) {
  // …
  return Object.assign(stubbedInstance, propertyValuePairs); // anything it doesn't recognise
}

@ jshado1もちろん、それは可能です。 この機能に興味がある場合は、プルリクエストを送信してください🙂

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