2013-01-22 55 views
5

मैं खरगोश एमक्यू इंटरैक्शन को रोकने की कोशिश कर रहा हूं, क्योंकि वे वास्तव में मेरे द्वारा लिखे गए एप्लिकेशन का मुख्य उद्देश्य नहीं हैं।मैं क्लोजर में लैंगोहर खरगोश एमक्यू इंटरैक्शन कैसे लगा सकता हूं?

तो, मैं तो जैसे मेरी परीक्षणों में langohr कार्यों rebinding की कोशिश की है:

(defn stub [ch] 
    (langohr.basic/ack ch 1)) 

(deftest test-stub 
    (with-redefs [langohr.basic/ack (fn [a1 a2] true)] 
    (is (= true (stub "dummy"))))) 

जब मैं lein test के साथ परीक्षण चलाने के लिए, मैं एक

java.lang.ClassCastException: 
redwood.env_test$fn__2210$fn__2211 cannot be cast to clojure.lang.IFn$OLO 

मैं कोशिश कर रहा है मिल बिना किसी प्रगति के लैंगोहर lib कार्यों को फिर से परिभाषित करने या पुनर्निर्मित करने के लिए विभिन्न परीक्षण ढांचे सहित कई अन्य तरीकों।

मैंने अन्य परिदृश्यों का परीक्षण किया है और मैंने सफलतापूर्वक उपरोक्त कोड संरचना के साथ चेशर (जेसन पार्सिंग क्लोजर lib) कार्यों को सफलतापूर्वक दबा दिया है। मैं नम्रता से यह समझने में सहायता का अनुरोध करता हूं कि मेरे लैंगोहर स्टब्स क्यों काम नहीं कर रहे हैं और इस बारे में सुझावों के लिए कि मैं इसे एक सुंदर तरीके से कैसे कर सकता हूं।

उत्तर

6

क्लासकास्ट अपवाद इसलिए होता है क्योंकि langohr.basic/ack एक ऐसा कार्य है जो एक प्राचीन तर्क लेता है - विशेष रूप से, यह clojure.lang.IFn $ OLO प्रकार है, जहां ओएलओ "ऑब्जेक्ट, लांग, ऑब्जेक्ट" के लिए खड़ा है।

आपको इसे उसी प्रकार के रूप में फिर से बनाना होगा। इसे आज़माएं:

(with-redefs [langohr.basic/ack (fn [a1 ^long a2] true)] ...) 
+1

धन्यवाद श्री पर्किन्स, मैंने क्लोजर कोड में देखा और देखा कि जावा में ओएलओ फ़ंक्शन कहां है। मैं उलझन में हूं क्योंकि जब मैं अपने चयन के एक समारोह में वापसी करता हूं, तो मुझे यह क्यों करना चाहिए कि मेरे फ़ंक्शन तर्क प्रकार क्या होना चाहिए? मैंने सोचा कि नया var पुराना से स्वतंत्र था। लैंगोहर में एक 'langohr.basic/nack' फ़ंक्शन भी है जो एके के समान क्रियान्वयन के साथ लिखा गया है, फिर भी इस फ़ंक्शन को क्लासकास्टेसेप्शन के बिना सफलतापूर्वक पुनः परिभाषित किया गया था। – Phong

+2

यह महत्वपूर्ण है क्योंकि कॉलिंग फ़ंक्शन (आपके उदाहरण में 'स्टब') कोड में संकलित हो जाता है जो var 'langhor.basic/ack' को खराब करता है और फिर परिणाम को 'IFN $ OLO' पर डालने का प्रयास करता है। ऐसा इसलिए होता है क्योंकि संकलक देखता है कि संकलन समय पर, 'langhor.basic/ack' उस प्रकार के एक फ़ंक्शन को संदर्भित करता है, और इसे एक आदिम (अनबॉक्सिंग) लंबे समय तक पारित करने में सक्षम होने के लिए कलाकारों को करने की आवश्यकता होती है। कुछ कोड देखे बिना, मैं नहीं कह सकता कि क्यों 'नाक' आपको एक ही त्रुटि नहीं दे रहा है, लेकिन ध्यान रखें कि यह 'स्टब' का आह्वान है, न कि खुद को लालसा, जो विफल रहता है, और यह कि संकलन-समय मामलों पर टाइप करें। –

+0

धन्यवाद श्री पर्किन्स, बहुत अंतर्दृष्टिपूर्ण और उपयोगी। – Phong