2017-01-17 22 views
7

मैं उदाहरण के लिए जेस्ट के साथ एक समारोह उपहास करने के लिए है, लेकिन केवल अगर यह विशिष्ट तर्क के साथ कहा जाता है, चाहते हैं:क्या मैं जेस्ट का उपयोग करके विशिष्ट तर्कों के साथ कार्यों का नकल कर सकता हूं?

function sum(x, y) { 
    return x + y; 
} 

// mock sum(1, 1) to return 4 
sum(1, 1) // returns 4 (mocked) 
sum(1, 2) // returns 3 (not mocked) 

एक समान सुविधा रूबी के RSpec पुस्तकालय में लागू नहीं है:

class Math 
    def self.sum(x, y) 
    return x + y 
    end 
end 

allow(Math).to receive(:sum).with(1, 1).and_return(4) 
Math.sum(1, 1) # returns 4 (mocked) 
Math.sum(1, 2) # returns 3 (not mocked) 

0123:

मुझे अपने परीक्षणों में प्राप्त करने के लिए कोशिश कर रहा हूँ एक बेहतर decoupling है, मान लीजिए कि मैं एक समारोह है कि sum पर निर्भर करता है का परीक्षण करना चाहते हैं

function sum2(x) { 
    return sum(x, 2); 
} 

// I don't want to depend on the sum implementation in my tests, 
// so I would like to mock sum(1, 2) to be "anything I want", 
// and so be able to test: 

expect(sum2(1)).toBe("anything I want"); 

// If this test passes, I've the guarantee that sum2(x) is returning 
// sum(x, 2), but I don't have to know what sum(x, 2) should return 

मुझे पता है की तरह कुछ कर रही द्वारा इस लागू करने के लिए एक तरह से है कि वहाँ:

sum = jest.fn(function (x, y) { 
    if (x === 1 && y === 2) { 
    return "anything I want"; 
    } else { 
    return sum(x, y); 
    } 
}); 

expect(sum2(1)).toBe("anything I want"); 

लेकिन यह अच्छा होगा अगर हम इसे आसान बनाने के लिए कुछ चीनी समारोह था होगा।

क्या यह उचित लगता है? क्या हमारे पास जेस्ट में पहले से ही यह सुविधा है?

आपकी प्रतिक्रिया के लिए धन्यवाद।

उत्तर

4

अभी तक जेस्ट में ऐसा करने का कोई तरीका नहीं है। इसके लिए आप sinons stubs का उपयोग कर सकते हैं। दस्तावेज़ों से:

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("TypeError"); 

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

यह मदद मिल सकती है ...

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

var mockedQueue = []; 
mockedQueue.push(() => {return 'A';}) 
mockedQueue.push(() => {return 'B';}) 

service.invoke = jest.fn(()=>{ 
    serviceFunctionToCall = mockedQueue.shift(); 
    return serviceFunctionToCall(); 
}) 
संबंधित मुद्दे