Sinon.JS 7

Stubs




sinon

Stubs

स्टब्स क्या हैं?

टेस्ट स्टब्स पूर्व-प्रोग्राम किए गए व्यवहार के साथ फ़ंक्शंस (जासूस) हैं।

वे उन तरीकों के अलावा पूर्ण परीक्षण जासूस एपीआई का समर्थन करते हैं जिनका उपयोग स्टब के व्यवहार को बदलने के लिए किया जा सकता है।

जासूसों के रूप में, स्टब्स या तो गुमनाम हो सकते हैं, या मौजूदा कार्यों को लपेट सकते हैं। स्टब के साथ मौजूदा फ़ंक्शन को लपेटते समय, मूल फ़ंक्शन को नहीं बुलाया जाता है।

स्टब्स का उपयोग कब करें?

जब आप चाहते हैं एक ठूंठ का प्रयोग करें:

  1. एक विशिष्ट पथ को कोड को बाध्य करने के लिए एक परीक्षण से एक विधि के व्यवहार को नियंत्रित करें। उदाहरणों में त्रुटि हैंडलिंग का परीक्षण करने के लिए त्रुटि फेंकने के लिए एक विधि को शामिल करना शामिल है।

  2. जब आप किसी विशिष्ट विधि को सीधे कॉल करने से रोकना चाहते हैं (संभवतः क्योंकि यह अवांछित व्यवहार को ट्रिगर करता है, जैसे कि XMLHttpRequest या समान)।

निम्नलिखित उदाहरण PubSubJS एक और परीक्षण है जो दिखाता है कि एक गुमनाम ठूंठ कैसे बनाया जाता है जो एक अपवाद को फेंकता है जब बुलाया जाता है।

"test should call all subscribers, even if there are exceptions" : function(){
    var message = 'an example message';
    var stub = sinon.stub().throws();
    var spy1 = sinon.spy();
    var spy2 = sinon.spy();

    PubSub.subscribe(message, stub);
    PubSub.subscribe(message, spy1);
    PubSub.subscribe(message, spy2);

    PubSub.publishSync(message, undefined);

    assert(spy1.called);
    assert(spy2.called);
    assert(stub.calledBefore(spy1));
}

ध्यान दें कि स्टब जासूसी इंटरफ़ेस को कैसे लागू करता है। परीक्षण सत्यापित करता है कि सभी कॉलबैक कहा जाता था, और यह भी कि स्टब फेंकने वाले अपवाद को अन्य कॉलबैक में से एक से पहले बुलाया गया था।

लगातार कॉल पर अड़ियल व्यवहार को परिभाषित करना

returns या throws जैसे व्यवहार को परिभाषित करने वाले तरीकों को कॉल करना कई बार स्टब के व्यवहार को ओवरराइड करता है। onCall संस्करण 1.8 के रूप में, आप लगातार कॉल पर एक अलग प्रतिक्रिया देने के लिए onCall विधि का उपयोग कर सकते हैं।

ध्यान दें कि सिनॉन संस्करण 1.5 से संस्करण 1.7 में, yields* लिए कई कॉल yields* और callsArg* विधियों के परिवार लगातार कॉल के लिए व्यवहार के एक क्रम को परिभाषित करते हैं। 1.8 तक, इस कार्यक्षमता को onCall API के पक्ष में हटा दिया गया है।

स्टब एपीआई

गुण

var stub = sinon.stub();

एक अनाम स्टब फ़ंक्शन बनाता है

var stub = sinon.stub(object, "method");

object.method फ़ंक्शन के साथ object.method . object.method को object.method करता है। यदि संपत्ति पहले से ही एक फ़ंक्शन नहीं है, तो एक अपवाद फेंक दिया जाता है।

object.method.restore(); कॉल करके मूल फ़ंक्शन को पुनर्स्थापित किया जा सकता है object.method.restore(); (या stub.restore(); )

var stub = sinon.stub(object, "method", func);

इसे v3.0.0 से हटा दिया गया है। इसके बजाय आपको उपयोग करना चाहिए

stub(obj, 'meth').callsFake(fn)

आपके कोड को अपग्रेड करने के लिए एक कोडमॉड उपलब्ध है

var stub = sinon.stub(obj);

ऑब्जेक्ट के सभी तरीकों को स्टब्स करता है।

ध्यान दें कि आमतौर पर व्यक्तिगत विधियों को स्टब करना बेहतर अभ्यास है, विशेष रूप से उन वस्तुओं पर जिन्हें आप समझ नहीं पाते हैं या (जैसे लाइब्रेरी निर्भरता) के लिए सभी तरीकों को नियंत्रित नहीं करते हैं।

अलग-अलग तरीकों के परीक्षणों का परीक्षण करना अधिक सटीक रूप से इरादा करता है और अप्रत्याशित व्यवहार के लिए कम संवेदनशील होता है क्योंकि ऑब्जेक्ट का कोड विकसित होता है।

यदि आप MyConstructor का स्टब ऑब्जेक्ट बनाना चाहते हैं, लेकिन MyConstructor को MyConstructor नहीं करना चाहते हैं, तो इस उपयोगिता फ़ंक्शन का उपयोग करें।

var stub = sinon.createStubInstance(MyConstructor, overrides);

overrides एक वैकल्पिक मानचित्र है, जो स्टब्स द्वारा बनाए गए ओवरड्राइडिंग का उदाहरण है:

var stub = sinon.createStubInstance(MyConstructor, {
    foo: sinon.stub().returnsThis()
});

के समान है:

var stub = sinon.createStubInstance(MyConstructor);
stub.foo.returnsThis();

यदि प्रदान किया गया मान एक स्टब नहीं है, तो इसे दिए गए मान के रूप में उपयोग किया जाएगा:

var stub = sinon.createStubInstance(MyConstructor, {
    foo: 3
});

के समान है:

var stub = sinon.createStubInstance(MyConstructor);
stub.foo.returns(3);

stub.withArgs(arg1[, arg2, ...]);

केवल प्रदान किए गए तर्कों के लिए विधि को स्टब्स करता है।

यह आपके कथनों में अधिक अभिव्यंजक होने के लिए उपयोगी है, जहां आप एक ही कॉल के साथ जासूस तक पहुंच सकते हैं। यह एक स्टब बनाने के लिए भी उपयोगी है जो विभिन्न तर्कों के जवाब में अलग तरह से कार्य कर सकता है।

"test should stub method differently based on arguments": function () {
    var callback = sinon.stub();
    callback.withArgs(42).returns(1);
    callback.withArgs(1).throws("name");

    callback(); // No return value, no exception
    callback(42); // Returns 1
    callback(1); // Throws Error("name")
}

stub.onCall(n); V1.8 में जोड़ा गया

Nth कॉल पर स्टब के व्यवहार को परिभाषित करता है। अनुक्रमिक बातचीत के परीक्षण के लिए उपयोगी।

"test should stub method differently on consecutive calls": function () {
    var callback = sinon.stub();
    callback.onCall(0).returns(1);
    callback.onCall(1).returns(2);
    callback.returns(3);

    callback(); // Returns 1
    callback(); // Returns 2
    callback(); // All following calls return 3
}

वहाँ तरीके onFirstCall , onSecondCall , onThirdCall स्टब परिभाषा बनाने के लिए और अधिक स्वाभाविक रूप से पढ़ रहे हैं।

onCall को इस खंड में व्यवहार के सभी तरीकों के साथ जोड़ा जा सकता है। विशेष रूप से, यह एक साथ उपयोग किया जा सकता है withArgs

"test should stub method differently on consecutive calls with certain argument": function () {
    var callback = sinon.stub();
    callback.withArgs(42)
        .onFirstCall().returns(1)
        .onSecondCall().returns(2);
    callback.returns(0);

    callback(1); // Returns 0
    callback(42); // Returns 1
    callback(1); // Returns 0
    callback(42); // Returns 2
    callback(1); // Returns 0
    callback(42); // Returns 0
}

ध्यान दें कि तर्क 42 लिए ठूंठ का व्यवहार डिफ़ॉल्ट व्यवहार पर वापस आ जाता है, क्योंकि कोई और कॉल परिभाषित नहीं की गई है।

stub.onFirstCall();

stub.onCall(0); लिए उपनाम stub.onCall(0);

stub.onSecondCall();

stub.onCall(1); लिए उपनाम stub.onCall(1);

stub.onThirdCall();

stub.onCall(2); लिए उपनाम stub.onCall(2);

stub.reset();

स्टब के व्यवहार और इतिहास दोनों को रीसेट करता है।

यह दोनों stub.resetBehavior() और stub.resetHistory() को कॉल करने के बराबर है

[email protected] में अपडेट किया गया

चूंकि [email protected]

एक सुविधा के रूप में, आप stub.reset() का उपयोग करके सभी स्टब्स पर sinon.reset()

stub.resetBehavior();

स्टब के व्यवहार को डिफ़ॉल्ट व्यवहार पर रीसेट करता है

var stub = sinon.stub();

stub.returns(54)

stub(); // 54

stub.resetBehavior();

stub(); // undefined

चूंकि [email protected]

आप sinon.resetBehavior() का उपयोग करके सभी स्टब्स का व्यवहार रीसेट कर सकते हैं

stub.resetHistory();

चूंकि [email protected]

स्टब के इतिहास को रीसेट करता है

var stub = sinon.stub();

stub.called // false

stub();

stub.called // true

stub.resetHistory();

stub.called // false

चूंकि [email protected]

आप sinon.resetHistory() का उपयोग करके सभी स्टब्स का इतिहास रीसेट कर सकते हैं

stub.callsFake(fakeFunction);

fakeFunction कॉल किए जाने पर प्रदान की गई fakeFunction कॉल करता है।

var myObj = {};
myObj.prop = function propFn() {
    return 'foo';
};

sinon.stub(myObj, 'prop').callsFake(function fakeFn() {
    return 'bar';
});

myObj.prop(); // 'bar'

stub.returns(obj);

स्टब प्रदान किए गए मान को लौटाता है।

stub.returnsArg(index);

प्रदान किए गए सूचकांक पर तर्क को वापस करने के लिए स्टब का कारण बनता है।

stub.returnsArg(0); पहला तर्क वापस करने के लिए ठूंठ का कारण बनता है।

यदि उपलब्ध इंडेक्स पर तर्क उपलब्ध नहीं है, तो [email protected] से पहले, एक undefined मान वापस किया जाएगा; [email protected] से शुरू [email protected] , एक TypeError फेंका जाएगा।

stub.returnsThis();

इसके मान को वापस करने के लिए स्टब का कारण बनता है।

JQuery शैली धाराप्रवाह APIs के लिए उपयोगी है।

stub.resolves(value);

एक वादा लौटाने के लिए ठूंठ का कारण बनता है जो प्रदान किए गए मूल्य का समाधान करता है।

प्रॉमिस का निर्माण करते समय, साइनॉन Promise.resolve विधि का उपयोग करता है। आप वातावरण में एक पॉलीफिल प्रदान करने के लिए जिम्मेदार हैं जो Promise नहीं करते हैं। प्रॉमिस लाइब्रेरी का उपयोग करते हुए अधिलेखित पद्धति का अधिलेखित किया जा सकता है।

चूंकि [email protected]

stub.resolvesArg(index);

एक वादा लौटाने के लिए ठूंठ का कारण बनता है जो प्रदान किए गए सूचकांक में तर्क का समाधान करता है।

stub.resolvesArg(0); एक वादा वापस करने के लिए ठूंठ का कारण बनता है जो पहले तर्क के लिए हल होता है।

यदि प्रदान किए गए इंडेक्स पर तर्क उपलब्ध नहीं है, तो TypeError को फेंक दिया जाएगा।

चूँकि [email protected]

stub.throws();

अपवाद ( Error ) को फेंकने के लिए स्टब का कारण बनता है।

stub.throws("name"[, "optional message"]);

प्रदान की गई स्ट्रिंग को name संपत्ति के साथ एक अपवाद फेंकने के लिए ठूंठ का कारण बनता है। संदेश पैरामीटर वैकल्पिक है और अपवाद का message गुण सेट करेगा।

stub.throws(obj);

प्रदान अपवाद वस्तु को फेंकने के लिए ठूंठ का कारण बनता है।

stub.throws(function() { return new Error(); });

फ़ंक्शन द्वारा लौटाए गए अपवाद को फेंकने के लिए स्टब का कारण बनता है।

stub.throwsArg(index);

प्रदान किए गए सूचकांक पर तर्क को फेंकने के लिए ठूंठ का कारण बनता है।

stub.throwsArg(0); पहले तर्क को अपवाद के रूप में फेंकने के लिए ठूंठ का कारण बनता है।

यदि प्रदान किए गए इंडेक्स पर तर्क उपलब्ध नहीं है, तो TypeError को फेंक दिया जाएगा।

चूंकि [email protected]

stub.rejects();

एक वादा वापस करने के लिए ठूंठ का कारण बनता है जो एक अपवाद ( Error ) के साथ अस्वीकार करता है।

प्रॉमिस का निर्माण करते समय, साइनॉन Promise.reject विधि का उपयोग करता है। आप वातावरण में एक पॉलीफिल प्रदान करने के लिए जिम्मेदार हैं जो Promise नहीं करते हैं। प्रॉमिस लाइब्रेरी का उपयोग करते हुए अधिलेखित पद्धति का अधिलेखित किया जा सकता है।

चूंकि [email protected]

stub.rejects("TypeError");

एक वादा वापस करने के लिए ठूंठ का कारण बनता है जो प्रदान प्रकार के अपवाद के साथ अस्वीकार करता है।

चूंकि [email protected]

stub.rejects(value);

एक वादा वापस करने के लिए ठूंठ का कारण बनता है जो प्रदान की गई अपवाद वस्तु के साथ अस्वीकार करता है।

चूंकि [email protected]

stub.callsArg(index);

कॉलबैक फ़ंक्शन के रूप में प्रदान किए गए इंडेक्स पर तर्क को कॉल करने के लिए स्टब का कारण बनता है।

stub.callsArg(0); पहले तर्क को कॉलबैक के रूप में कॉल करने के लिए ठूंठ का कारण बनता है।

यदि प्रदान किए गए इंडेक्स पर तर्क उपलब्ध नहीं है या फ़ंक्शन नहीं है, तो TypeError फेंक दिया जाएगा।

stub.callThrough();

मूल विधि का कारण बनता है जब कहा जाता है कि किसी भी सशर्त स्टब्स का मिलान नहीं किया जाता है।

var stub = sinon.stub();

var obj = {};

obj.sum = function sum(a, b) {
    return a + b;
};

stub(obj, 'sum');

obj.sum.withArgs(2, 2).callsFake(function foo() {
    return 'bar';
});

obj.sum.callThrough();

obj.sum(2, 2); // 'bar'
obj.sum(1, 2); // 3

stub.callsArgOn(index, context);

जैसे stub.callsArg(index); लेकिन this संदर्भ को पारित करने के लिए एक अतिरिक्त पैरामीटर के साथ।

stub.callsArgWith(index, arg1, arg2, ...);

जैसे callsArg , लेकिन कॉलबैक को पास करने के लिए तर्कों के साथ।

stub.callsArgOnWith(index, context, arg1, arg2, ...);

ऊपर की तरह लेकिन this संदर्भ को पारित करने के लिए एक अतिरिक्त पैरामीटर के साथ।

stub.usingPromise(promiseLibrary);

stub.rejects या stub.resolves का उपयोग करते समय वैश्विक एक के बजाय एक विशिष्ट वादा पुस्तकालय का उपयोग करके वादे वापस करने के लिए ठूंठ का कारण stub.resolves । पीछा करने की अनुमति देने के लिए स्टब लौटाता है।

var myObj = {
    saveSomething: sinon.stub().usingPromise(bluebird.Promise).resolves("baz");
}

myObj.saveSomething()
    .tap(function(actual) {
        console.log(actual); // baz
    });

चूंकि [email protected]

stub.yields([arg1, arg2, ...])

callsArg समान।

पहले दिए गए कॉलबैक को प्राप्त करने के लिए स्टब का कारण बनता है जो प्रदान किए गए तर्कों (यदि कोई हो) के साथ प्राप्त होता है।

यदि कोई विधि एक से अधिक कॉलबैक स्वीकार करती है, तो आपको अंतिम कॉलबैक या कॉल के लिए yieldsRight का उपयोग करने की आवश्यकता है।

stub.yieldsRight([arg1, arg2, ...])

yields तरह लेकिन अंतिम कॉलबैक जो इसे प्राप्त करता है।

stub.yieldsOn(context, [arg1, arg2, ...])

yields तरह लेकिन this संदर्भ को पारित करने के लिए एक अतिरिक्त पैरामीटर के साथ।

stub.yieldsTo(property, [arg1, arg2, ...])

जासूसी के लिए एक वस्तु की संपत्ति के रूप में पारित एक कॉलबैक को आमंत्रित करने के लिए जासूस का कारण बनता है।

yields तरह, yields पहले मिलान तर्क को yieldsTo है, कॉलबैक को ढूंढती है और इसे (वैकल्पिक) तर्कों के साथ बुलाती है।

stub.yieldsToOn(property, context, [arg1, arg2, ...])

ऊपर की तरह लेकिन this संदर्भ को पारित करने के लिए एक अतिरिक्त पैरामीटर के साथ।

"test should fake successful ajax request": function () {
    sinon.stub(jQuery, "ajax").yieldsTo("success", [1, 2, 3]);

    jQuery.ajax({
        success: function (data) {
            assertEquals([1, 2, 3], data);
        }
    });
}

stub.yield([arg1, arg2, ...])

दिए गए तर्कों के साथ स्टैक को कॉलबैक वापस भेजें।

यदि स्टब को फ़ंक्शन तर्क के साथ कभी नहीं बुलाया गया था, तो yield एक त्रुटि फेंकता है।

यदि कोई त्रुटि नहीं है, तो सभी कॉलबैक रिटर्न मानों के साथ एक एरे लौटाता है।

इसके अलावा invokeCallback रूप में invokeCallback

stub.yieldTo(callback, [arg1, arg2, ...])

स्टेक के लिए एक वस्तु की संपत्ति के रूप में पारित कॉलबैक को आमंत्रित करता है।

yield तरह, पहले मिलान तर्क को yieldTo है, कॉलबैक पाता है और इसे (वैकल्पिक) तर्कों के साथ कहता है।

"calling callbacks": function () {
    var callback = sinon.stub();
    callback({
        "success": function () {
            console.log("Success!");
        },
        "failure": function () {
            console.log("Oh noes!");
        }
    });

    callback.yieldTo("failure"); // Logs "Oh noes!"
}

stub.callArg(argNum)

yield तरह, लेकिन एक स्पष्ट तर्क संख्या के साथ निर्दिष्ट करें कि किस कॉलबैक पर कॉल करना है।

यदि किसी फ़ंक्शन को एक से अधिक कॉलबैक के साथ कॉल किया जाता है, तो उपयोगी है और केवल पहला कॉलबैक कॉल करना वांछित नहीं है।

"calling the last callback": function () {
    var callback = sinon.stub();
    callback(function () {
        console.log("Success!");
    }, function () {
        console.log("Oh noes!");
    });

    callback.callArg(1); // Logs "Oh noes!"
}

stub.callArgWith(argNum, [arg1, arg2, ...])

जैसे callArg , लेकिन तर्कों के साथ।

अतुल्यकालिक कॉल

उनके संबंधित गैर-एसिंक्स समकक्षों के रूप में भी, लेकिन कॉलबैक के साथ कॉल को स्थगित करने के बाद वर्तमान कॉल स्टैक में सभी निर्देशों को संसाधित किया जाता है।

  • नोड वातावरण में कॉलबैक process.nextTick साथ आस्थगित है process.nextTick
  • एक ब्राउज़र में कॉलबैक को setTimeout(callback, 0) दिया गया है।

अधिक जानकारी:

stub.callsArgAsync(index);

stub.callsArg(index) का Async संस्करण। एसिंक्रोनस कॉल भी देखें।

stub.callsArgOnAsync(index, context);

Stub.callsArgOn (अनुक्रमणिका, संदर्भ) का Async संस्करण। एसिंक्रोनस कॉल भी देखें।

stub.callsArgWithAsync(index, arg1, arg2, ...);

Stub.callsArgWith (अनुक्रमणिका, arg1, arg2,…) का Async संस्करण। एसिंक्रोनस कॉल भी देखें।

stub.callsArgOnWithAsync(index, context, arg1, arg2, ...);

Stub.callsArgOnWith (अनुक्रमणिका, संदर्भ, arg1, arg2,…) का Async संस्करण। एसिंक्रोनस कॉल भी देखें।

stub.yieldsAsync([arg1, arg2, ...]);

Stub.yields ([arg1, arg2,…]) का Async संस्करण। एसिंक्रोनस कॉल भी देखें।

stub.yieldsOnAsync(context, [arg1, arg2, ...]);

Stub.yieldsOn (संदर्भ, [arg1, arg2,…]) का Async संस्करण। एसिंक्रोनस कॉल भी देखें।

stub.yieldsToAsync(property, [arg1, arg2, ...]);

Stub.yieldsTo (संपत्ति, [arg1, arg2,…]) का Async संस्करण। एसिंक्रोनस कॉल भी देखें।

stub.yieldsToOnAsync(property, context, [arg1, arg2, ...])

Stub.yieldsToOn (संपत्ति, संदर्भ, [arg1, arg2,…]) का Async संस्करण। एसिंक्रोनस कॉल भी देखें।

sinon.addBehavior(name, fn);

एक कस्टम व्यवहार जोड़ें। नाम स्टब्स पर एक फ़ंक्शन के रूप में उपलब्ध होगा, और आपके लिए चैनिंग तंत्र स्थापित किया जाएगा (उदाहरण के लिए आपके फ़ंक्शन से कुछ भी वापस करने की कोई आवश्यकता नहीं है, इसका रिटर्न मान अनदेखा किया जाएगा)। नकली को इसके पहले तर्क के रूप में और फिर उपयोगकर्ता के तर्कों को पारित किया जाएगा।

const sinon = require('sinon');

sinon.addBehavior('returnsNum', (fake, n) => fake.returns(n));

var stub = sinon.stub().returnsNum(42);

assert.equals(stub(), 42);

stub.get(getterFn)

इस ठूंठ के लिए एक नया गटर बदल देता है।

var myObj = {
    prop: 'foo'
};

sinon.stub(myObj, 'prop').get(function getterFn() {
    return 'bar';
});

myObj.prop; // 'bar'

stub.set(setterFn)

इस ठूंठ के लिए एक नया सेटर परिभाषित करता है।

var myObj = {
    example: 'oldValue',
    prop: 'foo'
};

sinon.stub(myObj, 'prop').set(function setterFn(val) {
    myObj.example = val;
});

myObj.prop = 'baz';

myObj.example; // 'baz'

stub.value(newVal)

इस ठूंठ के लिए एक नया मान परिभाषित करता है।

var myObj = {
    example: 'oldValue',
};

sinon.stub(myObj, 'example').value('newValue');

myObj.example; // 'newValue'

आप restore विधि को कॉल करके मान को पुनर्स्थापित कर सकते हैं:

var myObj = {
    example: 'oldValue',
};

var stub = sinon.stub(myObj, 'example').value('newValue');
stub.restore()

myObj.example; // 'oldValue'