<p>IE11 でウィンドウ オブジェクトのスタブ プロパティを復元すると、sinon が失敗する</p>

作成日 2018年08月22日  ·  4コメント  ·  ソース: sinonjs/sinon

バグの説明
スタブは可能ですが、IE11 のウィンドウ オブジェクトの一部のプロパティを復元することはできません。これにより、sinon がタイプ エラーをスローします: TypeError: Cannot redefine non-configurable property '...'

再現する
https://jsbin.com/qixexucasa/edit?js ,console,output - IE11 と他のブラウザーの動作を比較します。

"TypeError: Cannot redefine non-configurable property 'parent'
   at restore (https://unpkg.com/[email protected]/pkg/sinon.js:3253:13)
   at Global code (https://null.jsbin.com/runner:18:1)"

予想される行動
IE11 では、ウィンドウ オブジェクトの特定のプロパティは構成できませんが、それらをスタブすることは可能であり、これはテストで非常に役立ちます。 予想される動作は次のいずれかです。

  1. sinon は、(restore() ステップではなく) スタブ ステップでこのプロパティをスタブできないというエラーをスローする必要があります。
  2. プロパティ sinon をスタブするときに、元のconfigurable属性をコピーしてはいけません。これには何か理由がありますか? false値の場合、sinon 自体に問題が発生するだけなので、それを復元することはできません。 したがって、この行は常にtrue必要があります。
    https://github.com/sinonjs/sinon/blob/638e104d1e6ed9908c1b09bd33d2cba1aa8c217a/lib/sinon/default-behaviors.js#L251

環境:

  • ライブラリ バージョン: すべてのバージョンが影響を受け、4.4.6 および 6.1.5 でテストされています。

バグなのか、予想通りの動作なのか確認してください。

Bug Help wanted hacktoberfest pinned

最も参考になるコメント

私は同じ問題を抱えていて、sinon/default-behaviors.js 行 258 でその原因を見つけました。

value: function value(fake, newVal) {
    var rootStub = fake.stub || fake;

    Object.defineProperty(rootStub.rootObj, rootStub.propName, {
        value: newVal,
        enumerable: true,
        configurable: isPropertyConfigurable(rootStub.rootObj, rootStub.propName)
    });

    return fake;
}

元のオブジェクトの構成可能なオプションに従う必要がある理由がわかりません。 スタブした後は、元のオブジェクトのオプションに関係なく、復元または書き換え (通常は sinon.restore()) できるため、常に true である必要があると思います。

コードが常に true を返すように変更することで、一時的にこの問題を修正しました。

全てのコメント4件

問題について詳しく説明していただきありがとうございます。

2 番目の戦略を実行すると、実際に IE11 でこれが機能しますか? もしそうなら、それは私の好みです。

必要な変更を加えるためにプルリクエストに貢献する準備はできていますか?

この問題は、最近活動がないため、自動的に古いものとしてマークされています。 それ以上の活動がなければ閉鎖されます。 ご協力ありがとうございます。

この問題は、最近活動がないため、自動的に古いものとしてマークされています。 それ以上の活動がなければ閉鎖されます。 ご協力ありがとうございます。

私は同じ問題を抱えていて、sinon/default-behaviors.js 行 258 でその原因を見つけました。

value: function value(fake, newVal) {
    var rootStub = fake.stub || fake;

    Object.defineProperty(rootStub.rootObj, rootStub.propName, {
        value: newVal,
        enumerable: true,
        configurable: isPropertyConfigurable(rootStub.rootObj, rootStub.propName)
    });

    return fake;
}

元のオブジェクトの構成可能なオプションに従う必要がある理由がわかりません。 スタブした後は、元のオブジェクトのオプションに関係なく、復元または書き換え (通常は sinon.restore()) できるため、常に true である必要があると思います。

コードが常に true を返すように変更することで、一時的にこの問題を修正しました。

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