2016-10-26 7 views
4

Я пытаюсь заглушить супер-вызов с помощью sinon и es2016, но мне не очень повезло. Любые идеи, почему это не работает?ES2016 Class, Sinon Stub Constructor

Запуск узла 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

Интересно это не работает для меня: 'AssertionError: ожидается от 0 до равной 1' - я скопировал ваш пример выше. – klyd

+0

Хм ... Интересно, обновлено с новыми изменениями .. Подумайте, что это обходной путь :) – anoop

+0

Ваш новый пример, похоже, не работает с моим узлом 6.2.2 и babel es2016 preset. – 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'); 

Например, это будет работать с Жасмином.

Mocha вместо этого работает в среде Node, нет window. Переменная вы бы искали это global

Смежные вопросы