Sinon.JS 7

Spies




sinon

Spies

परिचय

एक परीक्षण जासूस क्या है?

एक परीक्षण जासूस एक ऐसा फ़ंक्शन है जो अपने सभी calls लिए तर्कों, रिटर्न वैल्यू, इस के मूल्य और अपवाद (यदि कोई हो) को रिकॉर्ड calls । जासूस दो प्रकार के होते हैं: कुछ अनाम कार्य हैं, जबकि अन्य विधियां लपेटते हैं जो पहले से ही परीक्षण के तहत सिस्टम में मौजूद हैं।

एक अनाम फ़ंक्शन के रूप में एक जासूस बनाना

जब स्पाइड-ऑन फ़ंक्शन का व्यवहार परीक्षण के अधीन नहीं है, तो आप एक अनाम फ़ंक्शन जासूस का उपयोग कर सकते हैं। जासूस अपने calls बारे में रिकॉर्ड जानकारी के अलावा कुछ नहीं करेगा। इस प्रकार की जासूसी के लिए एक सामान्य उपयोग का मामला परीक्षण कर रहा है कि एक फ़ंक्शन कॉलबैक को कैसे संभालता है, जैसा कि निम्नलिखित सरलीकृत उदाहरण में है:

"test should call subscribers on publish": function () {
    var callback = sinon.spy();
    PubSub.subscribe("message", callback);

    PubSub.publishSync("message");

    assertTrue(callback.called);
}

मौजूदा पद्धति को लपेटने के लिए एक जासूस का उपयोग करना

sinon.spy(object, "method") एक स्पाई बनाता है जो मौजूदा फ़ंक्शन object.method लपेटता है। जासूस बिल्कुल मूल विधि की तरह व्यवहार करेगा (जब एक निर्माणकर्ता के रूप में उपयोग किया जाता है), लेकिन आपके पास सभी calls बारे में डेटा तक पहुंच होगी। निम्नलिखित एक थोड़ा विपरीत उदाहरण है:

{
    setUp: function () {
        sinon.spy(jQuery, "ajax");
    },

    tearDown: function () {
        jQuery.ajax.restore(); // Unwraps the spy
    },

    "test should inspect jQuery.getJSON's usage of jQuery.ajax": function () {
        jQuery.getJSON("/some/resource");

        assert(jQuery.ajax.calledOnce);
        assertEquals("/some/resource", jQuery.ajax.getCall(0).args[0].url);
        assertEquals("json", jQuery.ajax.getCall(0).args[0].dataType);
    }
}

जासूस बनाना: sinon.spy() विधि हस्ताक्षर

var spy = sinon.spy();
एक अनाम फ़ंक्शन बनाता है जो तर्कों को रिकॉर्ड करता है, this मान, अपवाद और सभी कॉल के लिए मान लौटाता है।
var spy = sinon.spy(myFunc);
प्रदान किए गए फ़ंक्शन पर जासूसी करता है
var spy = sinon.spy(object, "method");
object.method लिए एक जासूस बनाता है और जासूस के साथ मूल विधि को बदल देता है। यदि संपत्ति पहले से ही एक फ़ंक्शन नहीं है, तो एक अपवाद फेंक दिया जाता है। जासूस सभी मामलों में मूल विधि की तरह कार्य करता है। object.method.restore() कॉल करके मूल विधि को पुनर्स्थापित किया जा सकता है। लौटी हुई जासूसी फ़ंक्शन ऑब्जेक्ट है जिसने मूल विधि को बदल दिया है। spy === object.method

स्पाई एपीआई

जासूस उनके उपयोग का निरीक्षण करने के लिए एक समृद्ध इंटरफ़ेस प्रदान करते हैं। उपर्युक्त उदाहरणों में calledOnce बूलियन प्रॉपर्टी के साथ-साथ getCall विधि और लौटी हुई ऑब्जेक्ट की getCall प्रॉपर्टी को दिखाया गया है। calls डेटा का निरीक्षण करने के तीन तरीके हैं।

पसंदीदा तरीका है जासूस की calledWith विधि (और दोस्तों) का उपयोग करना क्योंकि यह आपके परीक्षण को बहुत विशिष्ट होने से रोकता है कि किस कॉल ने क्या किया और इतने पर क्या किया। यह true अगर जासूस कभी भी प्रदान की गई दलीलों के साथ बुलाया गया था।

"test should call subscribers with message as first argument" : function () {
    var message = 'an example message';
    var spy = sinon.spy();

    PubSub.subscribe(message, spy);
    PubSub.publishSync(message, "some payload");

    assert(spy.calledWith(message));
}

यदि आप विशिष्ट होना चाहते हैं, तो आप सीधे पहले calls के पहले तर्क की जांच कर सकते हैं। इसे प्राप्त करने के दो तरीके हैं:

"test should call subscribers with message as first argument" : function () {
    var message = 'an example message';
    var spy = sinon.spy();

    PubSub.subscribe(message, spy);
    PubSub.publishSync(message, "some payload");

    assertEquals(message, spy.args[0][0]);
}
"test should call subscribers with message as first argument" : function () {
    var message = 'an example message';
    var spy = sinon.spy();

    PubSub.subscribe(message, spy);
    PubSub.publishSync(message, "some payload");

    assertEquals(message, spy.getCall(0).args[0]);
}

पहला उदाहरण सीधे जासूसी पर दो आयामी args सरणी का उपयोग करता है, जबकि दूसरा उदाहरण पहली calls ऑब्जेक्ट को प्राप्त करता है और फिर उसके args एरे तक पहुंचता है। कौन सा उपयोग करना प्राथमिकता का विषय है, लेकिन अनुशंसित दृष्टिकोण spy.calledWith(arg1, arg2, ...) साथ जा रहा है spy.calledWith(arg1, arg2, ...) जब तक कि परीक्षणों को अत्यधिक विशिष्ट बनाने की आवश्यकता न हो।

एपीआई

जासूसी वस्तुएं sinon.spy() से लौटी हुई वस्तुएँ हैं। जब sinon.spy(object, method) साथ मौजूदा तरीकों पर जासूसी की जाती है, तो निम्न गुण और विधियाँ sinon.spy(object, method) . object.method पर भी उपलब्ध हैं।

गुण

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

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

"should call method once with each argument": function () {
    var object = { method: function () {} };
    var spy = sinon.spy(object, "method");

    object.method(42);
    object.method(1);

    assert(spy.withArgs(42).calledOnce);
    assert(spy.withArgs(1).calledOnce);
}

spy.callCount

दर्ज की गई calls की संख्या।

spy.called

true अगर कम से कम एक बार जासूस को बुलाया गया था

spy.notCalled

true अगर जासूस को नहीं बुलाया गया था

spy.calledOnce

true अगर जासूस को एक बार बुलाया गया था

spy.calledTwice

true अगर जासूस को दो बार बुलाया गया था

spy.calledThrice

true अगर जासूस को तीन बार कहा जाता था

spy.firstCall

पहली calls

spy.secondCall

दूसरी calls

spy.thirdCall

तीसरी calls

spy.lastCall

आखिरी calls

spy.calledBefore(anotherSpy);

यदि जासूस anotherSpy सामने जासूसी anotherSpy था तो वह वापस anotherSpy

spy.calledAfter(anotherSpy);

यदि जासूस anotherSpy बाद बुलाया गया था तो true

spy.calledImmediatelyBefore(anotherSpy);

true अगर spy को anotherSpy से पहले calls गया था, और spy और anotherSpy बीच कोई जासूस calls हुई।

spy.calledImmediatelyAfter(anotherSpy);

true अगर spy एक और anotherSpy बाद बुलाया गया था, और किसी अन्य जासूस और spy बीच कोई जासूस calls हुआ।

spy.calledOn(obj);

यह true अगर जासूस को कम से कम एक बार obj साथ this बुलाया गया था। calledOn है कि एक मिलानकर्ता calledOn भी स्वीकार करता है spyCall.calledOn(sinon.match(fn)) ( spyCall.calledOn(sinon.match(fn)) देखें)।

spy.alwaysCalledOn(obj);

यह true अगर जासूस हमेशा this obj साथ बुलाया गया था।

spy.calledWith(arg1, arg2, ...);

यदि जासूस कम से कम एक बार प्रदान की गई दलीलों के साथ कहा जाता true तो यह true है।

आंशिक मिलान के लिए इस्तेमाल किया जा सकता है, सिनोन केवल वास्तविक तर्कों के खिलाफ प्रदान किए गए तर्कों की जांच करता है, इसलिए एक कॉल जो प्रदान किए गए तर्कों (उसी स्पॉट में) और संभवतः अन्य के रूप में अच्छी तरह से true हो जाएगी।

spy.calledOnceWith(arg1, arg2, ...);

true अगर प्रदान की गई तर्कों के साथ एक बार जासूस को बुलाया गया था।

spy.alwaysCalledWith(arg1, arg2, ...);

अगर जासूस हमेशा प्रदान किए गए तर्कों (और संभवतः अन्य) के साथ कहा जाता true तो true

spy.calledWithExactly(arg1, arg2, ...);

यदि जासूस कम से कम एक बार प्रदान किए गए तर्कों और अन्य लोगों के साथ नहीं कहा जाता true तो यह true

spy.calledOnceWithExactly(arg1, arg2, ...);

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

spy.alwaysCalledWithExactly(arg1, arg2, ...);

अगर जासूस को हमेशा सटीक प्रदान की गई दलीलों के साथ बुलाया जाता true तो यह true है।

spy.calledWithMatch(arg1, arg2, ...);

true अगर जासूस मिलान तर्क (और संभवतः दूसरों) के साथ बुलाया गया था।

यह spy.calledWith(sinon.match(arg1), sinon.match(arg2), ...)

spy.alwaysCalledWithMatch(arg1, arg2, ...);

यह true कि यदि जासूस को हमेशा मेल खाते तर्कों (और संभवतः अन्य) के साथ बुलाया जाता है।

यह spy.alwaysCalledWith(sinon.match(arg1), sinon.match(arg2), ...)

spy.calledWithNew();

यदि जासूस / स्टब को new ऑपरेटर कहा जाता true तो यह true

खबरदार कि यह this वस्तु के मूल्य और जासूसी फ़ंक्शन के prototype आधार पर अनुमान लगाया prototype , इसलिए यह गलत सकारात्मकता दे सकता है यदि आप सक्रिय रूप से सही प्रकार की वस्तु वापस करते हैं।

spy.neverCalledWith(arg1, arg2, ...);

यदि जासूस / ठूंठ को कभी भी प्रदान की गई दलीलों के साथ नहीं बुलाया गया तो यह true है।

spy.neverCalledWithMatch(arg1, arg2, ...);

true अगर जासूस / ठूंठ कभी भी मिलान तर्क के साथ नहीं बुलाया गया था।

यह spy.neverCalledWith(sinon.match(arg1), sinon.match(arg2), ...)

spy.threw();

अगर जासूस कम से कम एक बार अपवाद फेंक देता true तो यह true

spy.threw("TypeError");

अगर जासूस कम से कम एक बार प्रदान किए गए अपवाद को छोड़ देता true तो यह true

spy.threw(obj);

अगर जासूस कम से कम एक बार प्रदान की गई वस्तु को फेंक देता true तो यह true

spy.alwaysThrew();

true अगर जासूस हमेशा एक अपवाद फेंक दिया।

spy.alwaysThrew("TypeError");

यदि जासूस हमेशा प्रदान किए गए प्रकार के अपवाद को फेंक देता true तो यह true

spy.alwaysThrew(obj);

true अगर जासूस हमेशा प्रदान अपवाद वस्तु फेंक दिया।

spy.returned(obj);

यदि जासूस कम से कम एक बार प्रदान किए गए मान को लौटाता true तो यह true

वस्तुओं और सरणियों के लिए गहरी तुलना का उपयोग करता है। सख्त तुलना spy.returned(sinon.match.same(obj)) देखें spy.returned(sinon.match.same(obj)) लिए spy.returned(sinon.match.same(obj)) उपयोग करें।

spy.alwaysReturned(obj);

अगर जासूस हमेशा प्रदान किए गए मूल्य को लौटाता true तो यह true

var spyCall = spy.getCall(n);

Nt call लौटाता है।

जब एक से अधिक बार स्पाई कहा जाता है, तो व्यक्तिगत कॉल एक्सेस करना अधिक विस्तृत व्यवहार सत्यापन के साथ मदद करता है।

sinon.spy(jQuery, "ajax");
jQuery.ajax("/stuffs");
var spyCall = jQuery.ajax.getCall(0);

assertEquals("/stuffs", spyCall.args[0]);

var spyCalls = spy.getCalls();

जासूस द्वारा दर्ज की गई सभी calls का एक Array लौटाता है।

spy.thisValues

this ऑब्जेक्ट की सरणी, spy.thisValues[0] पहली calls लिए this ऑब्जेक्ट है।

spy.args

प्राप्त तर्कों की सरणी, spy.args[0] पहली calls में प्राप्त तर्कों की एक सरणी है।

spy.exceptions

अपवाद ऑब्जेक्ट्स का ऐरे, spy.exceptions[0] पहला calls द्वारा फेंका गया अपवाद है।

यदि कॉल में कोई त्रुटि नहीं थी, तो कॉल के स्थान पर .exceptions में .exceptions undefined हो जाएगा।

spy.returnValues

रिटर्न मानों की सरणी, spy.returnValues[0] पहली calls का रिटर्न मान है।

यदि कॉल ने स्पष्ट रूप से मान वापस नहीं किया है, तो .returnValues में कॉल के स्थान पर मान undefined हो जाएगा।

spy.resetHistory();

एक जासूस की स्थिति का समाधान करता है।

spy.restore();

मूल विधि के साथ जासूस को बदल देता है। केवल तब ही उपलब्ध होता है यदि जासूस किसी मौजूदा पद्धति को बदल देता है।

spy.printf("format string", [arg1, arg2, ...]);

दिए गए प्रतिस्थापन के साथ पारित प्रारूप स्ट्रिंग लौटाता है:

%n
डिफ़ॉल्ट रूप से जासूस "जासूस" का नाम)
%c
जितनी बार जासूस को बुलाया गया, उसे शब्दों में ("एक बार", "दो बार", आदि)
%C
जासूसी के लिए कॉल के स्ट्रिंग निरूपण की एक सूची, प्रत्येक कॉल के साथ एक नई पंक्ति और चार रिक्त स्थान द्वारा उपसर्ग
%t
this मूल्यों की अल्पविराम-सीमांकित सूची में जासूस को बुलाया गया था
% n
एन वें तर्क के स्वरूपित मूल्य printf पास गया
%*
(गैर-प्रारूप स्ट्रिंग) तर्कों की अल्पविराम-सीमांकित सूची printf करने के लिए पारित की गई
%D
जासूस को सभी कॉल द्वारा प्राप्त तर्कों की एक बहु-पंक्ति सूची