javascript - test - sinon-chai
Copiando un método de clase con Sinon.js (4)
Gracias a @loganfsmyth por la propina. Pude hacer que el código auxiliar funcionara en un método de clase Ember como este:
sinon.stub(Foo.prototype.constructor, ''find'').returns([foo, foo]);
expect(Foo.find()).to.have.length(2)
Estoy intentando resguardar un método usando sinon.js pero obtengo el siguiente error:
Uncaught TypeError: Attempted to wrap undefined property sample_pressure as function
También fui a esta pregunta ( Stubbing y / o burla de una clase en sinon.js? ) Y copié y pegué el código, pero recibo el mismo error.
Aquí está mi código:
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());
Aquí está el jsFiddle ( http://jsfiddle.net/pebreo/wyg5f/5/ ) para el código anterior, y el jsFiddle para la pregunta SO que mencioné ( http://jsfiddle.net/pebreo/9mK5d/1/ )
Me aseguré de incluir sinon en los recursos externos en jsFiddle e incluso en jQuery 1.9. ¿Qué estoy haciendo mal?
La respuesta principal está en desuso. Ahora deberías usar:
sinon.stub(YourClass.prototype, ''myMethod'').callsFake(() => {
return {}
})
O para métodos estáticos:
sinon.stub(YourClass, ''myStaticMethod'').callsFake(() => {
return {}
})
O para casos simples simplemente use devoluciones:
sinon.stub(YourClass.prototype, ''myMethod'').returns({})
sinon.stub(YourClass, ''myStaticMethod'').returns({})
O si desea un método para una instancia:
const yourClassInstance = new YourClass();
sinon.stub(yourClassInstance, ''myMethod'').returns({})
Me encontré con el mismo error al intentar simular un método de una clase de CoffeeScript utilizando Sinon.
Dada una clase como esta:
class MyClass
myMethod: ->
# do stuff ...
Puede reemplazar su método con un espía de esta manera:
mySpy = sinon.spy(MyClass.prototype, "myMethod")
# ...
assert.ok(mySpy.called)
Simplemente reemplace spy
con stub
o mock
según sea necesario.
Tenga en cuenta que deberá reemplazar assert.ok
con cualquier aserción que tenga su marco de prueba.
Su código está intentando colgar una función en Sensor
, pero ha definido la función en Sensor.prototype
.
sinon.stub(Sensor, "sample_pressure", function() {return 0})
es esencialmente lo mismo que esto:
Sensor["sample_pressure"] = function() {return 0};
pero es lo suficientemente inteligente como para ver que Sensor["sample_pressure"]
no existe.
Entonces, lo que querrías hacer es algo como esto:
// 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());