साइनस स्टब्स को आसानी से साफ करना


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

Sinon सैंडबॉक्स के उपयोग के माध्यम से यह कार्यक्षमता प्रदान करता है , जिसका उपयोग कुछ तरीकों से किया जा सकता है:

// 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
@CamJackson जब आपको async परीक्षण मिल गया है, तो आपको पहली विधि का उपयोग करने की आवश्यकता है, अन्यथा आपके परीक्षण के पूरा होने से पहले ही साइनॉन अपने स्टब्स को साफ कर देता है।
कीथजग्रेंट

3
यदि आप sinon> 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
यहां तक कि neeter: afterEach (sinon.restore)
Benjam

मुझे लगता है कि यह बेहतर है क्योंकि स्पष्ट सैंडबॉक्स अनावश्यक जटिलता पैदा करते हैं। क्या आपको वास्तव में एक ही वस्तु के विभिन्न मोक्स के साथ कई अलग-अलग सैंडबॉक्स की आवश्यकता है? शायद ऩही।
Gherman

13

@Keithjgrant जवाब के लिए एक अद्यतन।

संस्करण v2.0.0 के बाद से, sinon.test पद्धति को एक अलग 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
या फिर आप वास्तव में सिनोन परीक्षण पैकेज का उपयोग करें और :-D से पहले के रूप में अपने कोड जारी रख सकते हैं
oligofren

10

आप इस में सचित्र के रूप में sinon.collection का उपयोग कर सकते हैं ब्लॉग पोस्ट (मई 2010 में दिनांकित) ।

Sinon.collection एपीआई बदल गया है और इसका उपयोग करने का एक तरीका निम्नलिखित है:

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और पर स्विच कर रहा है afterEachsetupऔर 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(); 
    });
});
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.