Stubing di un metodo di class con Sinon.js

Sto cercando di stubare un metodo usando sinon.js ma ottengo il seguente errore:

Uncaught TypeError: Attempted to wrap undefined property sample_pressure as function

Sono anche andato a questa domanda ( stub e / o prendendo in giro una class in sinon.js? ) E ho copiato e incollato il codice, ma ottengo lo stesso errore.

Ecco il mio codice:

 Sensor = (function() { // A simple Sensor class // Constructor function Sensor(pressure) { this.pressure = pressure; } Sensor.prototype.sample_pressure = function() { return this.pressure; }; return Sensor; })(); // Doesn't work var stub_sens = sinon.stub(Sensor, "sample_pressure").returns(0); // Doesn't work var stub_sens = sinon.stub(Sensor, "sample_pressure", function() {return 0}); // Never gets this far console.log(stub_sens.sample_pressure()); 

Ecco il jsFiddle ( http://jsfiddle.net/pebreo/wyg5f/5/ ) per il codice sopra, e il jsFiddle per la domanda SO che ho menzionato ( http://jsfiddle.net/pebreo/9mK5d/1/ ).

    Mi sono assicurato di includere sinon nelle risorse esterne in jsFiddle e anche in jQuery 1.9. Che cosa sto facendo di sbagliato?

    Il tuo codice sta tentando di eseguire una funzione su Sensor , ma hai definito la funzione su Sensor.prototype .

     sinon.stub(Sensor, "sample_pressure", function() {return 0}) 

    è essenzialmente lo stesso di questo:

     Sensor["sample_pressure"] = function() {return 0}; 

    ma è abbastanza intelligente da vedere che Sensor["sample_pressure"] non esiste.

    Quindi quello che vorresti fare è qualcosa del genere:

     // Stub the prototype's function so that there is a spy on any new instance // of Sensor that is created. Kind of overkill. sinon.stub(Sensor.prototype, "sample_pressure").returns(0); var sensor = new Sensor(); console.log(sensor.sample_pressure()); 

    o

     // Stub the function on a single instance of 'Sensor'. var sensor = new Sensor(); sinon.stub(sensor, "sample_pressure").returns(0); console.log(sensor.sample_pressure()); 

    o

     // Create a whole fake instance of 'Sensor' with none of the class's logic. var sensor = sinon.createStubInstance(Sensor); console.log(sensor.sample_pressure()); 

    La risposta principale è deprecata. Ora dovresti usare:

     sinon.stub(YourClass.prototype, 'myMethod').callsFake(() => { return {} }) 

    O per i metodi statici:

     sinon.stub(YourClass, 'myStaticMethod').callsFake(() => { return {} }) 

    O per casi semplici usa solo i resi:

     sinon.stub(YourClass.prototype, 'myMethod').returns({}) sinon.stub(YourClass, 'myStaticMethod').returns({}) 

    O se vuoi stubare un metodo per un’istanza:

     const yourClassInstance = new YourClass(); sinon.stub(yourClassInstance, 'myMethod').returns({}) 

    Mi sono imbattuto nello stesso errore cercando di prendere in giro un metodo di una class CoffeeScript usando Sinon.

    Data una class come questa:

     class MyClass myMethod: -> # do stuff ... 

    In questo modo puoi sostituire il suo metodo con una spia:

     mySpy = sinon.spy(MyClass.prototype, "myMethod") # ... assert.ok(mySpy.called) 

    Basta sostituire spy con stub o mock se necessario.

    Tieni presente che dovrai sostituire assert.ok con qualsiasi asserzione del tuo framework di test.

    Grazie a @loganfsmyth per il suggerimento. Sono stato in grado di far lavorare lo stub su un metodo di class Ember come questo:

     sinon.stub(Foo.prototype.constructor, 'find').returns([foo, foo]); expect(Foo.find()).to.have.length(2)