web-dev-qa-db-ja.com

sinonスタブを簡単にクリーンアップする

モカのbeforeEachブロックできれいに動作するすべてのsinon spysモックとスタブを簡単にリセットする方法はありますか?.

サンドボックス化はオプションですが、このためにサンドボックスを使用する方法はわかりません

beforeEach ->
  sinon.stub some, 'method'
  sinon.stub some, 'mother'

afterEach ->
  # I want to avoid these lines
  some.method.restore()
  some.other.restore()

it 'should call a some method and not other', ->
  some.method()
  assert.called some.method
121
austinbv

Sinonは Sandboxes を使用してこの機能を提供します。これはいくつかの方法で使用できます。

// manually create and restore the sandbox
var sandbox;
beforeEach(function () {
    sandbox = sinon.sandbox.create();
});

afterEach(function () {
    sandbox.restore();
});

it('should restore all mocks stubs and spies between tests', function() {
    sandbox.stub(some, 'method'); // note the use of "sandbox"
}

または

// wrap your test function in sinon.test()
it("should automatically restore all mocks stubs and spies", sinon.test(function() {
    this.stub(some, 'method'); // note the use of "this"
}));
281
keithjgrant

@keithjgrant回答の更新。

バージョンv2.0.0以降、sinon.testメソッドは 別のsinon-testモジュール に移動しました。古いテストに合格するには、各テストでこの追加の依存関係を構成する必要があります。

var sinonTest = require('sinon-test');
sinon.test = sinonTest.configureTest(sinon);

または、sinon-testを使用せずに sandboxes を使用します。

var sandbox = sinon.sandbox.create();

afterEach(function () {
    sandbox.restore();
});

it('should restore all mocks stubs and spies between tests', function() {
    sandbox.stub(some, 'method'); // note the use of "sandbox"
} 
11
anand

以前の回答では、これを達成するためにsandboxesを使用することが推奨されていますが、 ドキュメント に従っています。

[email protected]以降、sinonオブジェクトはデフォルトのサンドボックスです。

つまり、スタブ/モック/スパイのクリーンアップが次のように簡単になりました。

var sinon = require('sinon');

it('should do my bidding', function() {
    sinon.stub(some, 'method');
}

afterEach(function () {
    sinon.restore();
});
10
Myk Willis

Sinonライブラリの作成者による this ブログ投稿(2010年5月付け)に示されているように、sinon.collectionを使用できます。

Sinon.collection apiが変更され、使用方法は次のとおりです。

beforeEach(function () {
  fakes = sinon.collection;
});

afterEach(function () {
  fakes.restore();
});

it('should restore all mocks stubs and spies between tests', function() {
  stub = fakes.stub(window, 'someFunction');
}
10
Dimitris Zorbas

すべてのテストでsinonを常にリセットするセットアップが必要な場合:

helper.js内:

import sinon from 'sinon'

var sandbox;

beforeEach(function() {
    this.sinon = sandbox = sinon.sandbox.create();
});

afterEach(function() {
    sandbox.restore();
});

その後、テストで:

it("some test", function() {
    this.sinon.stub(obj, 'hi').returns(null)
})
6
sethcall

restore()は、スタブ化された機能の動作を復元するだけですが、スタブの状態はリセットしません。テストをsinon.testでラップしてthis.stubを使用するか、スタブでreset()を個別に呼び出す必要があります。

4
Sandeep Adi

Mochaの代わりにqunitを使用する場合、これらをモジュールにラップする必要があることに注意してください。

module("module name"
{
    //For QUnit2 use
    beforeEach: function() {
    //For QUnit1 use
    setup: function () {
      fakes = sinon.collection;
    },

    //For QUnit2 use
    afterEach: function() {
    //For QUnit1 use
    teardown: function () {
      fakes.restore();
    }
});

test("should restore all mocks stubs and spies between tests", function() {
      stub = fakes.stub(window, 'someFunction');
    }
);
3
sfuqua