Rust mockall गाइड: उदाहरण, सेटअप और उपयोग

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

Rust के लिए mockall: पूरी गाइड उदाहरणों के साथ

1. यह क्या है और क्यों ज़रूरी है

mockall लाइब्रेरी Rust भाषा में ऑटोमैटिक मॉक ऑब्जेक्ट्स (mock objects) बनाने का एक शक्तिशाली फ्रेमवर्क है। यह मॉड्यूलर टेस्टिंग के लिए डिज़ाइन की गई है और डेवलपर्स को बाहरी डिपेंडेंसीज जैसे डेटाबेस, HTTP-क्लाइंट, फ़ाइल सिस्टम या किसी भी अन्य सर्विस से टेस्ट किए जा रहे कोड को आसानी से अलग करने में मदद करती है। मैन्युअली टेस्ट स्टब्स लिखने के विपरीत, mockall मौजूदा ट्रेट्स (traits) के आधार पर ऑटोमैटिकली मॉक स्ट्रक्चर जनरेट करती है, जो एक्सपेक्टेशन सेट करने और कॉल्स वेरिफाई करने के लिए एक लचीला API प्रदान करती है।

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

mockall की मुख्य विशेषता Rust के टाइप सिस्टम के साथ इसका इंटीग्रेशन और #[automock] एट्रीब्यूट के ज़रिए कंपाइल टाइम पर काम करना है। इसका मतलब है कि किसी भी ट्रेट के लिए मॉक ऑटोमैटिकली जनरेट होते हैं, जो बहुत समय बचाता है और बॉयलरप्लेट कोड को कम करता है। यह लाइब्रेरी एसिंक्रोनस फंक्शन, जेनेरिक्स, एसोसिएटेड टाइप वाले ट्रेट्स और बहुत कुछ सपोर्ट करती है, जो इसे Rust में गंभीर डेवलपमेंट के लिए एक अपरिहार्य टूल बनाती है।

2. इंस्टॉलेशन

अपने Rust प्रोजेक्ट में mockall का उपयोग करने के लिए, Cargo.toml फ़ाइल में डिपेंडेंसी जोड़ें। यह लाइब्रेरी स्टैंडर्ड Cargo पैकेज मैनेजर के ज़रिए इंस्टॉल होती है। इसे केवल dev-dependency के रूप में जोड़ने की सलाह दी जाती है, क्योंकि इसका उपयोग केवल टेस्टिंग के लिए होता है।


# Cargo.toml
[dev-dependencies]
mockall = "0.13"  # पढ़ने के समय नवीनतम वर्जन का उपयोग करें
        

यह लाइन जोड़ने के बाद, cargo build या cargo test कमांड चलाएं ताकि Cargo लाइब्रेरी को डाउनलोड और कंपाइल कर सके। अगर आपके प्रोजेक्ट में पहले से अन्य डिपेंडेंसीज हैं, तो सुनिश्चित करें कि mockall का वर्जन आपके Rust वर्जन के साथ संगत है (आमतौर पर Rust 1.70+ चाहिए)। नवीनतम वर्जन देखने के लिए crates.io/crates/mockall पर जाएं।

3. त्वरित शुरुआत

चलिए एक न्यूनतम काम करने वाला उदाहरण बनाते हैं। मान लीजिए हमारे पास एक ट्रेट Greeter है, जिसे हम टेस्ट में मॉक करना चाहते हैं। #[automock] की मदद से हमें ऑटोमैटिकली MockGreeter स्ट्रक्चर मिल जाता है।


// src/lib.rs
use mockall::automock;

#[automock]
pub trait Greeter {
    fn greet(&self, name: &str) -> String;
}

pub fn run_greeter(greeter: &impl Greeter, name: &str) -> String {
    greeter.greet(name)
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_greeting() {
        // मॉक बनाएं
        let mut mock = MockGreeter::new();

        // एक्सपेक्टेशन सेट करें: greet("Alice") कॉल पर "Hello, Alice!" रिटर्न करे
        mock.expect_greet()
            .with(predicate::eq("Alice"))
            .returning(|name| format!("Hello, {}!", name));

        // टेस्ट किए जाने वाले फंक्शन को कॉल करें
        let result = run_greeter(&mock, "Alice");

        // रिजल्ट की जांच करें
        assert_eq!(result, "Hello, Alice!");
    }
}
        

टेस्ट को cargo test कमांड से चलाएं। अगर सब कुछ सही है, तो टेस्ट सफलतापूर्वक पास हो जाएगा।

अनुशंसाएँ