web-dev-qa-db-ja.com

ES2016クラス、Sinonスタブコンストラクター

私はシノンとes2016でスーパーコールをスタブしようとしていますが、あまり運がありません。これが機能しない理由はありますか?

Node 6.2.2を実行しています。これは、クラス/コンストラクターの実装に問題がある可能性があります。

.babelrcファイル:

{
  "presets": [
    "es2016"
  ],
  "plugins": [
    "transform-es2015-modules-commonjs",
    "transform-async-to-generator"
  ]
}

テスト:

import sinon from 'sinon';

class Foo {
  constructor(message) {
    console.log(message)
  }
}

class Bar extends Foo {
  constructor() {
    super('test');
  }
}

describe('Example', () => {
  it('should stub super.constructor call', () => {
    sinon.stub(Foo.prototype, 'constructor');

    new Bar();

    sinon.assert.calledOnce(Foo.prototype.constructor);
  });
});

結果:

test
AssertError: expected constructor to be called once but was called 0 times
    at Object.fail (node_modules\sinon\lib\sinon\assert.js:110:29)
    at failAssertion (node_modules\sinon\lib\sinon\assert.js:69:24)
    at Object.assert.(anonymous function) [as calledOnce] (node_modules\sinon\lib\sinon\assert.js:94:21)
    at Context.it (/test/classtest.spec.js:21:18)

:この問題はコンストラクターでのみ発生するようです。親クラスから継承されたメソッドを問題なくスパイできます。

15
klyd

JavaScriptが継承を実装する方法のために、subClasをsetPrototypeOfする必要があります。

const sinon = require("sinon");

class Foo {
  constructor(message) {
    console.log(message);
  }
}

class Bar extends Foo {
  constructor() {
    super('test');
  }
}

describe('Example', () => {
  it('should stub super.constructor call', () => {
    const stub = sinon.stub().callsFake();
    Object.setPrototypeOf(Bar, stub);

    new Bar();

    sinon.assert.calledOnce(stub);
  });
});
10
Wenshan

それも私にはうまくいきません。私はうまくいく回避策を管理しました、私もスパイを使います:

class FakeSchema {
  constructor(newCar) {
    this.constructorCallTest();
    this.name = newCar.name;
  }

  constructorCallTest() {
    mochaloggger.log('constructor was called');
  }

}

// spy that tracks the contsructor call
var fakeSchemaConstrSpy = sinon.spy(FakeCarSchema.prototype,'constructorCallTest');

お役に立てば幸い

0

spyの代わりにstubを使用する必要があります。

sinon.spy(Foo.prototype, 'constructor');

describe('Example', () => {
  it('should stub super.constructor call', () => {
    const costructorSpy = sinon.spy(Foo.prototype, 'constructor');
    new Bar();
    expect(costructorSpy.callCount).to.equal(1);
  });
});

***** Update ******上記は期待どおりに機能しませんでした。この方法を追加して現在機能しています。

 describe('Example', () => {
    it('should stub super.constructor call', () => {
      const FooStub = spy(() => sinon.createStubInstance(Foo));
      expect(FooStub).to.have.been.calledWithNew;
    });
 });
0
anoop

ブラウザー環境を使用している場合、以下も機能します。

let constructorSpy = sinon.spy(window, 'ClassName');

たとえば、これはジャスミンで動作します。

Mochaは代わりにNode環境で実行され、windowはありません。探している変数はglobalです。

0
Fabio Lolli