web-dev-qa-db-ja.com

Javascript:Sinonを使用したモックコンストラクター

Sinonを使用してコンストラクターをモックする方法を見つけようとして、髪を引っ張っています。いくつかの引数を受け取るコンストラクターを呼び出すことにより、複数のウィジェットを作成する関数があります。コンストラクターが正しいパラメーターで正しい回数呼び出されることを確認したいのですが、実際にウィジェットを構築したくありません。次のリンクは、コンストラクタをモックする簡単な方法を説明しているように見えますが、私には機能しません:

Jasmineを使用してコンストラクターをスパイする

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プロパティはありません。

どんな助けも大歓迎です。

36
sevenstripe

私のコードが新しい演算子を呼び出していたため、これに対する解決策が必要でした。新しい呼び出しが作成したオブジェクトをモックしたかった。

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);
17
starmer

Sinonjsの公式サイトから:

Object.methodをスタブ関数に置き換えます。元の関数は、object.method.restore()を呼び出すことで復元できます。 (またはstub.restore();)。プロパティが既に関数ではない場合、メソッドをスタブするときのタイプミスを避けるために、例外がスローされます。

これは単に、スタブを作成する関数がobjectオブジェクトのメンバーでなければならないことを示しています。

物事を明確にするため。あなたが呼ぶ

sinon.stub(window, "MyWidget");

MyWidget関数は、グローバルスコープ内にある必要があります(パラメーターとしてwindowを渡すため)。ただし、既に述べたように、この関数はローカルスコープ内にあります(おそらくオブジェクトリテラルまたは名前空間内で定義されます)。

JavaScriptでは、誰でもグローバルスコープにアクセスできますが、その逆はできません。

MyWidget関数を宣言する場所を確認し、コンテナーオブジェクトを最初のパラメーターとしてsinon.stub()に渡します

7
ppoliani

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を無効化またはリセットしてください!

2
user3331119

documentation。 でこれを見つけました

MyConstructorのスタブオブジェクトを作成したいが、コンストラクターを呼び出さない場合は、このユーティリティ関数を使用します。

var stub = sinon.createStubInstance(MyConstructor)

2
AXMIM

Sinon 4.4.2を使用して、次のようなインスタンスメソッドをモックできました。

sinon.stub(MyClass.prototype, myMethod).resolves(tesObj)

次のような行のモックが必要でした:

let someData = await new MyClass(token).myMethod(arg1, arg2)

同様のソリューションがここにあります: Sinon.jsでクラスメソッドをスタブ化

2
theUtherSide

誤ってsinon.stub.throws(expectedErr)ではなくsinon.stub().throws(expectedErr)と入力して、このエラーに遭遇しました。私は以前に同様の間違いを犯したことがあり、この特定のメッセージに出会ったことがないので、私を投げました。

1
user1978019

sinon.createStubInstance(MyES6ClassName)を使用し、newキーワードを使用してMyES6ClassNameを呼び出すと、MyES6ClassNameインスタンスのスタブが返されます。

0
Yiling

元の質問はもう少し古いことを知っていますが、クラスのプロトタイプをスタブしようとしましたか?

const myStub = sinon.stub(MyClass.prototype, 'myMethodReturnsFalse').returns(true)
const myInstance = new MyClass()
expect(myInstance.myMethodReturnsFalse()).equal(true)
0
Gerardo Lima