2016-10-26 85 views
4

我試圖用sinon和es2016取出一個超級調用,但我沒有多少運氣。任何想法爲什麼這不起作用?ES2016類,Sinon存根構造函數

運行節點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) 

注意:這個問題似乎只發生了構造函數。我可以窺探從父類繼承的方法,沒有任何問題。

回答

1

您需要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); 
    }); 
}); 

*****更新****** 以上預期不工作,我說這種方式是現在工作。

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

有趣的,這並沒有爲我工作: 'Asse田:預計0至等於1' - 我抄你上面的例子。 – klyd

+0

嗯...這很有趣,更新了新的變化..認爲這是一個解決方法:) – anoop

+0

你的新例子似乎仍然不能用我的節點6.2.2和babel es2016預設。 – klyd

0

它也不適用於我。我設法爲我工作的解決辦法,我用狙,以及:

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

如果你是在瀏覽器環境中,以下的作品太:

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

例如,這將與Jasmine一起工作。

Mocha改爲運行在Node環境中,沒有window。你會尋找變量是global