সিনন.জেএস সহ একটি শ্রেণিবদ্ধ পদ্ধতিতে স্টাবি করা


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/ ), এবং আমি যে এসও প্রশ্নের উল্লেখ করেছি তার জেএসফিডাল ( http://jsfiddle.net/pebreo/9mK5d/1/ )।

আমি জেসফিডাল এবং এমনকি jQuery 1.9 এর বাহ্যিক সংস্থানগুলিতে সিননকে অন্তর্ভুক্ত করার বিষয়টি নিশ্চিত করেছিলাম । আমি কি ভুল করছি?

উত্তর:


156

আপনার কোডটি একটি ফাংশন স্টাব করার চেষ্টা করছে 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());

4
কোন জিনিস অবমূল্যায়ন করা হয়?
লোগানফস্মিথ

sinon.stub (সেন্সর, "নমুনা_প্রেসার", ফাংশন () {
ফিরুন

এটি আমার উত্তরে কারণ মূল প্রশ্নটি এটি সম্পর্কে বিশেষভাবে জিজ্ঞাসা করেছিল। প্রদত্ত যে আমার উত্তরটি এটিকে শুরু করার সঠিক পদ্ধতির হিসাবে প্রস্তাব দেয় না, আপনি আমাকে কী পরিবর্তন করতে বলছেন তা আমি নিশ্চিত নই। .returns(0)ইতিমধ্যে একই জিনিস করে .callFake(() => 0)
লগানফস্মিথ

4
দেখে মনে হচ্ছে না যে returnsএটি হ্রাস করা হয়েছে। sinonjs.org/relayss/v3.0.0/stubs । @ danday74, দয়া করে রেফারেন্স সরবরাহ করুন।
অ্যালেনহকিম

4
@ danday74 .stubতৃতীয় আর্গুমেন্ট হিসাবে একটি ফাংশন সঙ্গে সরানো হয়: github.com/sinonjs/sinon/blob/master/lib/sinon/stub.js#L17 সঙ্গে কিছুই ভুল নেই .returnsবা .callsFake, তাই এই উত্তর দিয়ে কিছুই ভুল।
লগানফস্মিথ

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()পুরানো সংস্করণগুলির জন্য এটি কীভাবে হ্রাস করা যায়?
আইচখান

4
ES6 মডিউলগুলি ব্যবহার করার সময়: আমি একটি পরীক্ষা প্রকল্পে আপনার ক্লাস.জেট () এর স্টাব তৈরি করছি। পরীক্ষাটি এমন আরও একটি মডিউলকে কল করে যা আপনার ক্লাসটি আমদানি করে। মডিউল আপনার ক্লাস.জেট () স্টাবকে সম্মান করবে? যদি তা না হয় তবে এর কোন সমাধান আছে কি?
শিক্ষার্থী

4
আপনার সমাধানগুলি আমার পক্ষে কাজ করে। আমি আপনাকে আরও পয়েন্ট দিলে আশা করি: ডি ধন্যবাদ
রুবেল হাসান

5

আমি সিনন ব্যবহার করে কফিস্ক্রিপ্ট ক্লাসের কোনও পদ্ধতি উপহাস করার চেষ্টা করে একই ত্রুটির মধ্যে পড়েছিলাম।

এর মতো একটি ক্লাস দেওয়া হয়েছে:

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

আপনি কোনও গুপ্তচর দিয়ে এর পদ্ধতিটি এভাবে প্রতিস্থাপন করতে পারেন:

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

# ...

assert.ok(mySpy.called)

প্রয়োজনের spyসাথে stubবা কেবল প্রতিস্থাপন করুন mock

মনে রাখবেন যে assert.okআপনার পরীক্ষার কাঠামোর যা আছে তা দিয়ে আপনার প্রতিস্থাপন করতে হবে ।


2

টিপটির জন্য @ লগনফস্মিথকে ধন্যবাদ। আমি এম্বার ক্লাস পদ্ধতিতে স্টাবটি এইভাবে কাজ করতে সক্ষম হয়েছি:

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

4
এটি একটি মন্তব্য। অন্য উত্তরের জন্য ধন্যবাদ দিয়ে শুরু হয় এবং এর কোডটির নকল দিয়ে শেষ হয়।
মাইকেলপম

4
সদৃশটির মতো দেখায় না - এখানে রয়েছে Foo.prototype.constructor, যেখানে মূল উত্তরে রয়েছে Sensor.prototype। তারপরে, Foo.prototype.constructorআমার জন্য কাজ করে না। :)
শানচ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.