2014-01-12 19 views
64

Ich versuche, eine Methode sinon.js Stub, aber ich erhalte den folgenden Fehler:Stubbing eine Klassenmethode mit Sinon.js

Uncaught TypeError: Attempted to wrap undefined property sample_pressure as function

ich auch auf diese Frage ging (Stubbing and/or mocking a class in sinon.js?) und kopiert und habe den Code eingefügt, aber ich bekomme den gleichen Fehler.

Hier ist mein Code:

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()); 

Hier ist die jsFiddle (http://jsfiddle.net/pebreo/wyg5f/5/) für den obigen Code und die jsFiddle für die SO Frage, die ich erwähnt (http://jsfiddle.net/pebreo/9mK5d/1/).

Ich habe sicher Sinon in die Externe Ressourcen in jsFiddle und sogar jQuery 1.9 enthalten. Was mache ich falsch?

Antwort

114

Ihr Code versucht, eine Funktion auf Sensor zu stubben, aber Sie haben die Funktion auf Sensor.prototype definiert.

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

ist im Wesentlichen die gleiche wie folgt aus:

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

aber es ist klug genug, um zu sehen, dass Sensor["sample_pressure"] existiert nicht.

Also, was würden Sie tun möchten, ist so etwas wie diese:

// 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()); 

oder

// 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()); 

oder

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

Im Jahr 2017 ist dies veraltet. Sie sollten jetzt CallsFake verwenden - siehe meine Antwort unten. – danday74

+0

Welches Ding ist veraltet? – loganfsmyth

+0

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

2

Dank für die Spitze @loganfsmyth. Ich konnte den Stummel bekommen auf einer Ember Klasse Methode wie folgt zu arbeiten:

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

Dies ist ein Kommentar. Beginnt mit einem Dank an eine andere Antwort und endet mit einer Duplizierung seines Codes. – michelpm

+4

Sieht nicht wie eine Duplizierung aus - hier gibt es 'Foo.prototype.constructor', wo wie in der ursprünglichen Antwort' Sensor.prototype' steht. Andererseits funktioniert 'Foo.prototype.constructor' nicht für mich. :) – shaunc

2

ich in den gleichen Fehler lief versucht, eine Methode einer Klasse Coffee zu verspotten Sinon verwenden.

eine Klasse wie folgt gegeben:

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

Sie seine Methode mit einem Spion auf diese Weise ersetzen:

mySpy = sinon.spy(MyClass.prototype, "myMethod") 

# ... 

assert.ok(mySpy.called) 

Gerade spy mit stub oder mock bei Bedarf ersetzen.

Beachten Sie, dass Sie assert.ok durch jede Behauptung ersetzen müssen, die Ihr Testframework hat.

13

Die oberste Antwort ist veraltet.Sie sollten jetzt verwenden:

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

Oder für statische Methoden:

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

Oder für einfache Fälle gerade Rückkehr verwenden:

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

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

Oder wenn Sie eine Methode für eine Instanz Stummel :

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

Es wäre toll, wenn Sie die spezifische Version für Ihre genannte Methode erwähnen könnten, wenn diese zu 'sinonjs' hinzugefügt wurde, d. H.' CallsFake() ' Außerdem, für die älteren Versionen, wie kann dies veraltet sein? –

+0

Bei Verwendung von ES6-Modulen: Ich erstelle den Stub von YourClass.get() in einem Testprojekt. Der Test ruft ein anderes Modul auf, das YourClass importiert. Wird das Modul YourClass.get() den Stub respektieren? Wenn nicht, gibt es eine Lösung? – Learner