সিনোন ত্রুটিটি ইতিমধ্যে মোড়ানো ফাংশনটি মোড়ানোর চেষ্টা করা হয়েছে


92

যদিও এখানে একই প্রশ্ন রয়েছে তবে আমি আমার সমস্যার উত্তর পেতে পারি নি তাই এখানে আমার প্রশ্নটি চলেছে:

আমি আমার নোড জেএস অ্যাপটি মোচা এবং চই ব্যবহার করে পরীক্ষা করছি। আমি আমার ফাংশন মোড়ানোর জন্য সায়ন ব্যবহার করছি।

describe('App Functions', function(){

  let mockObj = sinon.stub(testApp, 'getObj', (dbUrl) => {
     //some stuff
  });
  it('get results',function(done) {
     testApp.someFun
  });
}

describe('App Errors', function(){

  let mockObj = sinon.stub(testApp, 'getObj', (dbUrl) => {
     //some stuff
  });
  it('throws errors',function(done) {
     testApp.someFun
  });
}

আমি যখন এই পরীক্ষাটি চালানোর চেষ্টা করি তখন এটি আমাকে ত্রুটি দেয়

Attempted to wrap getObj which is already wrapped

আমিও রাখার চেষ্টা করেছি

beforeEach(function () {
  sandbox = sinon.sandbox.create();
});

afterEach(function () {
  sandbox.restore();
});

প্রতিটি বর্ণনা, কিন্তু এখনও আমাকে একই ত্রুটি।


উত্তর:


113

আপনি পুনঃস্থাপন করা উচিত getObjমধ্যে after()ফাংশন, নিচের যেমন চেষ্টা করুন।

describe('App Functions', function(){
    var mockObj;
    before(function () {
            mockObj = sinon.stub(testApp, 'getObj', () => {
                 console.log('this is sinon test 1111');
            });
    });

    after(function () {
        testApp.getObj.restore(); // Unwraps the spy
    });

    it('get results',function(done) {
        testApp.getObj();
    });
});

describe('App Errors', function(){
    var mockObj;
    before(function () {
            mockObj = sinon.stub(testApp, 'getObj', () => {
                 console.log('this is sinon test 1111');
            });
    });

    after( function () {
        testApp.getObj.restore(); // Unwraps the spy
    });

    it('throws errors',function(done) {
         testApp.getObj();
    });
});

উপরোক্ত স্বীকৃত উপায়ে চেষ্টা করার পরে, আমি "সবার আগে" হুকের নীচে একই ত্রুটিটি পাচ্ছি
আশ্বিন হেগডে

@ আশ্বিনহেগডে, আপনি কি আমাকে আপনার পরীক্ষার কোডগুলি দিতে পারেন? আমি এখানে কিছু সমস্যা খুঁজে পেতে পারেন।
zangw

4
প্রত্যেকটি নির্দিষ্ট না করে সমস্ত স্টাব পুনরুদ্ধার করার কোনও উপায় নেই? আপনি sinon.restoreAll();যে স্টাব পুনরুদ্ধার করতে ভুলে যাবেন না তা নিশ্চিত করার জন্য সমস্ত পরীক্ষার পরে চালানো যেতে পারে এমনটি একটি দুর্দান্ত হবে ।
লুক

afterEach (() => {sinon.verifyAndRestore ();});
স্যাম টি

20

এই ত্রুটিটি স্টাব ফাংশনটি সঠিকভাবে পুনরুদ্ধার না করার কারণে। স্যান্ডবক্স ব্যবহার করুন এবং তারপরে স্যান্ডবক্স ব্যবহার করে স্টাব তৈরি করুন। স্যুটের ভিতরে প্রতিটি পরীক্ষার পরে, স্যান্ডবক্সটি পুনরুদ্ধার করুন

  beforeEach(() => {
      sandbox = sinon.createSandbox();
      mockObj = sandbox.stub(testApp, 'getObj', fake_function)
  });

  afterEach(() => {
      sandbox.restore();
  });

4
ডুড, আমার জীবন বাঁচিয়েছে)
ইয়েগোর জেরেবা

এটি আমার পক্ষে কাজ করেছে। আমি মনে করি এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
ড্যানিয়েল ক্যাপলান

মোড়ক ফাংশন সহ আমার একাধিক পরীক্ষা ছিল এবং পরে প্রত্যেকটি ব্যবহার করা দরকার
রিচার্ড

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

11

যে কোনও ক্ষেত্রে আপনাকে একটি অবজেক্টের সমস্ত পদ্ধতি পুনরুদ্ধার করতে হবে, আপনি এটি ব্যবহার করতে পারেন sinon.restore(obj)

উদাহরণ:

before(() => {
    userRepositoryMock = sinon.stub(userRepository);
});

after(() => {
    sinon.restore(userRepository);
});

4
বস্তুর উপর ফাংশনগুলি স্টব করার সময় এটি আমার পক্ষে কাজ করে না। আমাকে গ্রহণযোগ্য উত্তর শোগুলির মতো প্রতি ফাংশনটি পুনরুদ্ধার করতে হয়েছিল।
ইয়ান রবার্টসন

7
sinon.restore () সিনন ভি 2 তে অবচয় করা হয়েছিল এবং পরে তা সরানো হয়েছিল। // Previously sinon.restore(stubObject); // Typescript (stubObject as any).restore(); // Javascript stubObject.restore();
ম্যাথিয়াসসোমার

6

আমি মোচার আগের () এবং পরে () হুক ব্যবহার করে এটিও হিট করছি। আমি সর্বত্র উল্লিখিত হিসাবে পুনরুদ্ধার () ব্যবহার করছিলাম। একক পরীক্ষার ফাইল দৌড়েছে, একাধিক হয়নি। পরিশেষে মোচা মূল-স্তরের-হুকগুলি সম্পর্কে পাওয়া গেছে : আমার নিজের () এর আগে () এবং পরে () এর পরে আমার বর্ণনা নেই ()। সুতরাং এটি রুট-স্তরে () পূর্বে সমস্ত ফাইল সন্ধান করে এবং কোনও পরীক্ষা শুরু করার আগে সেগুলি কার্যকর করে।

সুতরাং নিশ্চিত করুন যে আপনার অনুরূপ প্যাটার্ন রয়েছে:

describe('my own describe', () => {
  before(() => {
    // setup stub code here
    sinon.stub(myObj, 'myFunc').callsFake(() => {
      return 'bla';
    });
  });
  after(() => {
    myObj.myFunc.restore();
  });
  it('Do some testing now', () => {
    expect(myObj.myFunc()).to.be.equal('bla');
  });
});

3

'পূর্বেআচ' তে স্টাবগুলি শুরু করার এবং সেগুলি 'আফটারএচ'-এ পুনরুদ্ধার করার পরামর্শ দেওয়া হয়। তবে আপনি যদি দুঃসাহসিক বোধ করছেন তবে নিম্নলিখিতগুলিও কার্যকর হয়।

describe('App Functions', function(){

  let mockObj = sinon.stub(testApp, 'getObj', (dbUrl) => {
     //some stuff
  });
  it('get results',function(done) {
     testApp.someFun
     mockObj .restore();
  });
}

describe('App Errors', function(){

  let mockObj = sinon.stub(testApp, 'getObj', (dbUrl) => {
     //some stuff
  });
  it('throws errors',function(done) {
     testApp.someFun
     mockObj .restore();
  });
}

3

এমনকি স্যান্ডবক্সের সাহায্যে এটি আপনাকে ত্রুটি দিতে পারে। বিশেষত যখন পরীক্ষাগুলি ES6 শ্রেণীর সমান্তরালে চলে।

const sb = sandbox.create();

before(() => {
  sb.stub(MyObj.prototype, 'myFunc').callsFake(() => {
    return 'whatever';
  });
});
after(() => {
  sb.restore();
});

যদি অন্য পরীক্ষা প্রোটোটাইপ থেকে মাইফ্যাঙ্ককে থামানোর চেষ্টা করে তবে এটি একই ত্রুটি ফেলতে পারে। আমি এটি ঠিক করতে সক্ষম হয়েছি তবে এতে আমি গর্বিত নই ...

const sb = sandbox.create();

before(() => {
  MyObj.prototype.myFunc = sb.stub().callsFake(() => {
    return 'whatever';
  });
});
after(() => {
  sb.restore();
});

3

এই সমস্যাটির জন্য যে কেউ চলছে, যদি আপনি পুরো অবজেক্টটির উপর স্ট্যাড বা গুপ্তচর হন, এবং আপনি পরে করেন

Sandbox.restore ()

তবুও ত্রুটি পাবেন। আপনাকে স্বতন্ত্র পদ্ধতিগুলি স্টাড / স্পাই করতে হবে।

আমি কী ভুল ছিল তা জানার চেষ্টা করে চিরতরে নষ্ট হয়ে গেলাম।

sinon-7.5.0


2

আমি গুপ্তচরদের সাথে এটি মধ্যে দৌড়ে। এই আচরণটি সিননের সাথে কাজ করার জন্য বেশ জটিল makes আমি একটি সহায়ক ফাংশন তৈরি করেছি যা কোনও নতুন সেট সেট করার আগে বিদ্যমান বিদ্যমান গুপ্তচরকে অপসারণ করার চেষ্টা করে। এইভাবে আমাকে রাষ্ট্রের আগে / পরে কোনও বিষয়ে চিন্তা করতে হবে না। অনুরূপ পন্থা স্টাবগুলির জন্যও কার্যকর হতে পারে।

import sinon, { SinonSpy } from 'sinon';

/**
 * When you set a spy on a method that already had one set in a previous test,
 * sinon throws an "Attempted to wrap [function] which is already wrapped" error
 * rather than replacing the existing spy. This helper function does exactly that.
 *
 * @param {object} obj
 * @param {string} method
 */
export const spy = function spy<T>(obj: T, method: keyof T): SinonSpy {
  // try to remove any existing spy in case it exists
  try {
    // @ts-ignore
    obj[method].restore();
  } catch (e) {
    // noop
  }
  return sinon.spy(obj, method);
};


0
function stub(obj, method) {
     // try to remove any existing stub in case it exists
      try {
        obj[method].restore();
      } catch (e) {
        // eat it.
      }
      return sinon.stub(obj, method);
    }

এবং পরীক্ষায় স্টাবগুলি তৈরি করার সময় এই ফাংশনটি ব্যবহার করুন। এটি 'সিননের ত্রুটিটি ইতিমধ্যে মোড়ানো ফাংশন মোড়ানোর চেষ্টা করা হয়েছে' ত্রুটিটি সমাধান করবে।

উদাহরণ:

stub(Validator.prototype, 'canGeneratePayment').returns(Promise.resolve({ indent: dTruckIndent }));
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.