Sinonを使用してコンストラクターをモックする方法を見つけようとして、髪を引っ張っています。いくつかの引数を受け取るコンストラクターを呼び出すことにより、複数のウィジェットを作成する関数があります。コンストラクターが正しいパラメーターで正しい回数呼び出されることを確認したいのですが、実際にウィジェットを構築したくありません。次のリンクは、コンストラクタをモックする簡単な方法を説明しているように見えますが、私には機能しません:
http://tinnedfruit.com/2011/03/25/testing-backbone-apps-with-jasmine-sinon-2.html
コンストラクタをスタブするために次の呼び出しを行うと:
sinon.stub(window, "MyWidget");
次のエラーが表示されます。
Uncaught TypeError: Attempted to wrap undefined property MyWidget as function
Chromeでデバッグすると、スコープ変数の[ローカル]セクションにMyWidgetが表示されますが、ウィンドウ外のMyWidgetプロパティはありません。
どんな助けも大歓迎です。
私のコードが新しい演算子を呼び出していたため、これに対する解決策が必要でした。新しい呼び出しが作成したオブジェクトをモックしたかった。
var MockExample = sinon.stub();
MockExample.prototype.test = sinon.stub().returns("42");
var example = new MockExample();
console.log("example: " + example.test()); // outputs 42
次に、rewireを使用して、テストしているコードにそれを挿入しました
rewiredModule = rewire('/path/to/module.js');
rewiredModule.__set__("Example", example);
Sinonjsの公式サイトから:
Object.methodをスタブ関数に置き換えます。元の関数は、object.method.restore()を呼び出すことで復元できます。 (またはstub.restore();)。プロパティが既に関数ではない場合、メソッドをスタブするときのタイプミスを避けるために、例外がスローされます。
これは単に、スタブを作成する関数がobjectオブジェクトのメンバーでなければならないことを示しています。
物事を明確にするため。あなたが呼ぶ
sinon.stub(window, "MyWidget");
MyWidget関数は、グローバルスコープ内にある必要があります(パラメーターとしてwindowを渡すため)。ただし、既に述べたように、この関数はローカルスコープ内にあります(おそらくオブジェクトリテラルまたは名前空間内で定義されます)。
JavaScriptでは、誰でもグローバルスコープにアクセスできますが、その逆はできません。
MyWidget関数を宣言する場所を確認し、コンテナーオブジェクトを最初のパラメーターとしてsinon.stub()に渡します
Mockeryを使用して、コンストラクター/関数を問題なくモックしました。
var mockery = require('mockery');
var sinon = require('sinon');
mockery.enable({
useCleanCache: true,
warnOnReplace: false,
warnOnUnregistered: false
});
exports.Client = function() {/* Client constructor Mock */};
var ClientSpy = sinon.spy(exports, 'Client');
mockery.registerMock('Client', ClientSpy);
var Factory = require('Factory'); // this module requires the Client module
上記の例と同じように、Sinon Spyを適用できるはずです。
テスト後にMockeryを無効化またはリセットしてください!
documentation。 でこれを見つけました
MyConstructorのスタブオブジェクトを作成したいが、コンストラクターを呼び出さない場合は、このユーティリティ関数を使用します。
var stub = sinon.createStubInstance(MyConstructor)
Sinon 4.4.2を使用して、次のようなインスタンスメソッドをモックできました。
sinon.stub(MyClass.prototype, myMethod).resolves(tesObj)
次のような行のモックが必要でした:
let someData = await new MyClass(token).myMethod(arg1, arg2)
同様のソリューションがここにあります: Sinon.jsでクラスメソッドをスタブ化
誤ってsinon.stub.throws(expectedErr)
ではなくsinon.stub().throws(expectedErr)
と入力して、このエラーに遭遇しました。私は以前に同様の間違いを犯したことがあり、この特定のメッセージに出会ったことがないので、私を投げました。
sinon.createStubInstance(MyES6ClassName)
を使用し、new
キーワードを使用してMyES6ClassNameを呼び出すと、MyES6ClassNameインスタンスのスタブが返されます。
元の質問はもう少し古いことを知っていますが、クラスのプロトタイプをスタブしようとしましたか?
const myStub = sinon.stub(MyClass.prototype, 'myMethodReturnsFalse').returns(true)
const myInstance = new MyClass()
expect(myInstance.myMethodReturnsFalse()).equal(true)