Sinon.js के साथ एक वर्ग विधि को ठोकर मारना


99

मैं sinon.js का उपयोग करते हुए एक विधि को स्टब करने की कोशिश कर रहा हूं, लेकिन मुझे निम्नलिखित त्रुटि मिलती है:

Uncaught TypeError: Attempted to wrap undefined property sample_pressure as function

मैं इस सवाल पर भी गया ( स्टबिंग और / या सिनॉन.जेएस में एक वर्ग का मज़ाक उड़ा रहा था? ) और कोड को कॉपी और पेस्ट किया लेकिन मुझे वही त्रुटि मिली।

यहाँ मेरा कोड है:

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

यहाँ उपरोक्त कोड के लिए jsFiddle ( http://jsfiddle.net/pebreo/wyg5f/5/ ) और SO SO प्रश्न है जो मैंने उल्लेख किया है ( http://jsfiddle.net/pyreo/9mK5d/1/) )।

मैंने बाह्य संसाधनों में sinon को jsFiddle और यहां तक ​​कि jQuery 1.9 में शामिल करना सुनिश्चित किया । मैं क्या गलत कर रहा हूं?

जवाबों:


155

आपका कोड किसी फ़ंक्शन को स्टब करने का प्रयास कर रहा है Sensor, लेकिन आपने फ़ंक्शन को परिभाषित किया है Sensor.prototype

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

अनिवार्य रूप से इस के रूप में ही है:

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

लेकिन यह देखने के लिए काफी स्मार्ट है कि Sensor["sample_pressure"]मौजूद नहीं है।

तो आप क्या करना चाहते हैं कुछ इस तरह है:

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

या

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

या

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

1
किस चीज का अपव्यय होता है?
लोगनफ़्समीथ

sinon.stub (सेंसर, "नमूना_प्रेस", फ़ंक्शन () {वापसी 0})
danday74

यह मेरे उत्तर में है क्योंकि मूल प्रश्न विशेष रूप से इसके बारे में पूछा गया है। यह देखते हुए कि मेरा उत्तर इसे शुरू करने के लिए सही दृष्टिकोण के रूप में नहीं बताता है, मुझे यकीन नहीं है कि आप मुझे क्या बदलने के लिए कह रहे हैं। .returns(0)पहले से ही के रूप में एक ही बात करता है .callFake(() => 0)
लोगान्सफैमेथ

1
ऐसा नहीं लगता कि returnsयह पदावनत है। sinonjs.org/releases/v3.0.0/stubs । @ danday74, कृपया संदर्भ प्रदान करें।
allenhwkim

2
@ danday74 .stubतीसरा तर्क के रूप में एक समारोह के साथ निकाली गई है: github.com/sinonjs/sinon/blob/master/lib/sinon/stub.js#L17 साथ कुछ भी नहीं गलत है .returnsया .callsFake, इसलिए इस जवाब के साथ कुछ भी नहीं गलत है।
loganfsmyth

52

शीर्ष उत्तर पदावनत है। अब आपको उपयोग करना चाहिए:

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

या स्थिर तरीकों के लिए:

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

या साधारण मामलों के लिए केवल रिटर्न का उपयोग करें:

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

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

या यदि आप एक विधि को उदाहरण के लिए स्टब करना चाहते हैं:

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

4
यह बहुत अच्छा होगा यदि आप अपनी उक्त पद्धति के लिए विशिष्ट संस्करण का उल्लेख कर सकते हैं जब इसे पुराने संस्करणों के लिए sinonjsयानी callsFake()इसके अलावा जोड़ा गया, तो इसे कैसे हटाया जा सकता है?
अनीचन

3
ES6 मॉड्यूल का उपयोग करते समय: मैं एक परीक्षण परियोजना में YourClass.get () का स्टब बना रहा हूं। परीक्षण एक और मॉड्यूल को कॉल करता है जो YourClass को आयात करता है। क्या मॉड्यूल YourClass.get () स्टब का सम्मान करेगा? यदि नहीं, तो क्या कोई समाधान है?
लर्नर

1
आपके समाधान मेरे लिए काम करते हैं। मेरी इच्छा है कि अगर मैं आपको अधिक अंक दूं: डी थैंक्स।
रुबेल हसन

5

मैं उसी त्रुटि में भाग गया जिसमें सिनॉन का उपयोग करके एक कॉफीस्क्रिप्ट क्लास की एक विधि का मजाक उड़ाने की कोशिश की गई।

इस तरह एक वर्ग दिया:

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

आप इस तरीके को जासूसी से बदल सकते हैं:

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

# ...

assert.ok(mySpy.called)

बस के spyसाथ stubया mockआवश्यकतानुसार बदलें ।

ध्यान दें कि आपको assert.okअपने परीक्षण ढांचे में जो भी अभिकथन करना है, उसे बदलना होगा ।


2

टिप के लिए @loganfsmyth को धन्यवाद। मैं इस तरह एक एम्बर वर्ग विधि पर काम करने के लिए ठूंठ पाने में सक्षम था:

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

3
यह एक टिप्पणी है। दूसरे उत्तर के लिए धन्यवाद के साथ शुरू होता है और इसके कोड के दोहराव के साथ समाप्त होता है।
माइकल

5
एक दोहराव की तरह नहीं दिखता है - यहाँ वहाँ है Foo.prototype.constructor, जहाँ मूल उत्तर के रूप में है Sensor.prototype। तो फिर, Foo.prototype.constructorमेरे लिए काम नहीं करता है। :)
shaunc
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.