সিনন স্টাবগুলি সহজেই পরিষ্কার করা


134

সমস্ত সিনোন স্পাই মকস এবং স্টাবগুলি সহজেই পুনরায় সেট করার কোনও উপায় আছে যা মোচার পূর্ববর্তী প্রতিটি ব্লকগুলির সাথে পরিষ্কারভাবে কাজ করবে।

আমি দেখতে পাচ্ছি স্যান্ডবক্সিং একটি বিকল্প তবে আপনি কীভাবে এর জন্য একটি স্যান্ডবক্স ব্যবহার করতে পারবেন তা আমি দেখতে পাচ্ছি না

beforeEach ->
  sinon.stub some, 'method'
  sinon.stub some, 'mother'

afterEach ->
  # I want to avoid these lines
  some.method.restore()
  some.other.restore()

it 'should call a some method and not other', ->
  some.method()
  assert.called some.method

উত্তর:


304

সিনন স্যান্ডবক্সগুলি ব্যবহারের মাধ্যমে এই কার্যকারিতা সরবরাহ করে যা কয়েকটি উপায়ে ব্যবহার করা যেতে পারে:

// manually create and restore the sandbox
var sandbox;
beforeEach(function () {
    sandbox = sinon.sandbox.create();
});

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

it('should restore all mocks stubs and spies between tests', function() {
    sandbox.stub(some, 'method'); // note the use of "sandbox"
}

অথবা

// wrap your test function in sinon.test()
it("should automatically restore all mocks stubs and spies", sinon.test(function() {
    this.stub(some, 'method'); // note the use of "this"
}));

6
@ ক্যামজ্যাকসন যখন আপনি অ্যাসিঙ্ক পরীক্ষাগুলি পেয়েছেন, আপনাকে প্রথম পদ্ধতিটি ব্যবহার করতে হবে, অন্যথায় আপনার পরীক্ষাটি শেষ হওয়ার আগে সাইনন তার স্টাবগুলি পরিষ্কার করে দেবে।
কিথজগ্রান্ট

3
আপনি যদি সিওন> 5.0 ব্যবহার করছেন তবে নীচে পড়ুন। এখন অনেক সহজ পদ্ধতি আছে: stackoverflow.com/a/55251560/4464702
RAnders00

53

পূর্ববর্তী উত্তরগুলি sandboxesএটি সম্পাদন করতে ব্যবহার করার পরামর্শ দেয় তবে ডকুমেন্টেশন অনুসারে :

Sinon@5.0.0 থেকে, sinon অবজেক্টটি একটি ডিফল্ট স্যান্ডবক্স।

তার অর্থ হল যে আপনার স্টাবগুলি / উপহাসগুলি / গুপ্তচরগুলি পরিষ্কার করা এখন এতটা সহজ:

var sinon = require('sinon');

it('should do my bidding', function() {
    sinon.stub(some, 'method');
}

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

10
এটি এপ্রিল 2018 এর পরে যে কেউ এটি পড়ার পক্ষে সেরা উত্তর
নিক কক্স

1
এমনকি আরও নিকটবর্তী: afterEach (sinon.restore)
বেনজাম

আমি মনে করি এটি আরও ভাল কারণ সুস্পষ্ট স্যান্ডবক্সগুলি অপ্রয়োজনীয় জটিলতা তৈরি করে। আপনি কি একই বস্তুর বিভিন্ন উপহাসের সাথে পৃথক পৃথক পৃথক স্যান্ডবক্স প্রয়োজন? সম্ভবত না.
গেরম্যান

13

@Keithjgrant উত্তরের একটি আপডেট।

সংস্করণ v2.0.0 থেকে, sinon.est পদ্ধতিটি একটি পৃথক sinon-testমডিউলে সরানো হয়েছে । পুরানো পরীক্ষাগুলি পাস করতে আপনাকে প্রতিটি পরীক্ষায় এই অতিরিক্ত নির্ভরতা কনফিগার করতে হবে:

var sinonTest = require('sinon-test');
sinon.test = sinonTest.configureTest(sinon);

বিকল্পভাবে, আপনি স্যান্ডবক্সগুলি ছাড়াই sinon-testএবং ব্যবহার করেন :

var sandbox = sinon.sandbox.create();

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

it('should restore all mocks stubs and spies between tests', function() {
    sandbox.stub(some, 'method'); // note the use of "sandbox"
} 

1
অথবা আপনি কেবল সিনোন-পরীক্ষা প্যাকেজটি ব্যবহার করতে পারেন এবং আগের মতো আপনার কোড চালিয়ে যেতে পারেন :
ডি

10

সিনন লাইব্রেরির লেখক দ্বারা এই ব্লগ পোস্টে (মে ২০১০ তারিখে তারিখে) চিত্রিত হিসাবে আপনি sinon.colration ব্যবহার করতে পারেন ।

Sinon.col নির্বাচন এপিআই পরিবর্তিত হয়েছে এবং এটির ব্যবহারের একটি উপায় নিম্নলিখিত:

beforeEach(function () {
  fakes = sinon.collection;
});

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

it('should restore all mocks stubs and spies between tests', function() {
  stub = fakes.stub(window, 'someFunction');
}

6

restore()কেবল স্ট্যাবড কার্যকারিতাটির আচরণ পুনরুদ্ধার করে তবে এটি স্টাবগুলির স্থিতি পুনরায় সেট করে না। আপনাকে হয় আপনার পরীক্ষাগুলি মোড়ানো sinon.testএবং ব্যবহার করতে হবে this.stubবা পৃথকভাবে reset()স্টাবগুলিতে কল করতে হবে


6

আপনি যদি এমন কোনও সেটআপ চান যা সায়ন সবসময় নিজেকে সমস্ত পরীক্ষার জন্য পুনরায় সেট করে রাখে:

সাহায্যকারী.জেএস এ:

import sinon from 'sinon'

var sandbox;

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

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

তারপরে, আপনার পরীক্ষায়:

it("some test", function() {
    this.sinon.stub(obj, 'hi').returns(null)
})

3

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

module("module name"
{
    //For QUnit2 use
    beforeEach: function() {
    //For QUnit1 use
    setup: function () {
      fakes = sinon.collection;
    },

    //For QUnit2 use
    afterEach: function() {
    //For QUnit1 use
    teardown: function () {
      fakes.restore();
    }
});

test("should restore all mocks stubs and spies between tests", function() {
      stub = fakes.stub(window, 'someFunction');
    }
);

3
qunit 2 স্যুইচ করা হয় beforeEachএবং afterEach। দ্য setupএবং teardownপদ্ধতি উঠিয়ে নেওয়া হবে।
কেভিন বুলাউঘে

0

একটি স্যান্ডবক্স তৈরি করুন যা আপনার সমস্ত গুপ্তচর, স্টাবস, মকস এবং নকলের জন্য একটি ব্ল্যাক বক্স ধারক হিসাবে কাজ করবে।

আপনাকে যা করতে হবে তা হ'ল প্রথমে বর্ণিত ব্লকটিতে একটি স্যান্ডবক্স তৈরি করা যাতে এটি সমস্ত পরীক্ষার ক্ষেত্রে অ্যাক্সেসযোগ্য। এবং একবার আপনি সমস্ত পরীক্ষার কেসগুলি সম্পন্ন করার পরে আপনার আসল পদ্ধতিগুলি প্রকাশ করা উচিত এবং sandbox.restore()আফটার হুকের পদ্ধতিটি ব্যবহার করে স্টাবগুলি পরিষ্কার করা উচিত যাতে রানটাইম সময়ে এটি রিলিজ হওয়া রিসোর্স afterEachপরীক্ষার কেস পাস বা ব্যর্থ হয়।

এখানে একটি উদাহরণ:

 describe('MyController', () => {
    //Creates a new sandbox object
    const sandbox = sinon.createSandbox();
    let myControllerInstance: MyController;

    let loginStub: sinon.SinonStub;
    beforeEach(async () => {
        let config = {key: 'value'};
        myControllerInstance = new MyController(config);
        loginStub = sandbox.stub(ThirdPartyModule, 'login').resolves({success: true});
    });
    describe('MyControllerMethod1', () => {
        it('should run successfully', async () => {
            loginStub.withArgs({username: 'Test', password: 'Test'}).resolves();
            let ret = await myControllerInstance.run();
            expect(ret.status).to.eq('200');
            expect(loginStub.called).to.be.true;
        });
    });
    afterEach(async () => {
        //clean and release the original methods afterEach test case at runtime
        sandbox.restore(); 
    });
});
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.