私はシノンと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)
注:この問題はコンストラクターでのみ発生するようです。親クラスから継承されたメソッドを問題なくスパイできます。
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);
});
});
それも私にはうまくいきません。私はうまくいく回避策を管理しました、私もスパイを使います:
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');
お役に立てば幸い
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;
});
});
ブラウザー環境を使用している場合、以下も機能します。
let constructorSpy = sinon.spy(window, 'ClassName');
たとえば、これはジャスミンで動作します。
Mochaは代わりにNode環境で実行され、window
はありません。探している変数はglobal
です。