2013-01-11 16 views
5

पूर्ण प्रकटीकरण: मैं ढांचे का मज़ाक उड़ाकर और मजाक करने के लिए बहुत नया हूं। मैं ScalaMock का उपयोग करने की कोशिश कर रहा हूं क्योंकि यह स्कैलाटेस्ट के साथ उपयोग करने के लिए 'डिफ़ॉल्ट' मॉकिंग फ्रेमवर्क जैसा प्रतीत होता है लेकिन मुझे स्कैलास्ट के साथ संगत किसी भी अन्य ढांचे का उपयोग करने में खुशी है।ScalaMock। एक कक्षा को मॉक करें जो तर्क लेता है

समस्या: मैंने स्काला में एक कक्षा में लिखा है जो सॉकेट से बात करता है। कक्षा में एक प्रकार का पैरामीटर है कि किस प्रकार की सॉकेट से बात करनी है और इसके तर्कों में से एक उस प्रकार के सॉकेट बनाने के लिए एक कारखाना है। यह हस्ताक्षर हैं:

class XScanner[T <: SocketClient](
    confPath: String = "/etc/default/configPath", 
    socketClientFactory: String => T 
) extends ScannerBase(path) 

मैं तो अपने परीक्षण कोड एक असली सॉकेट से कनेक्ट करने की जरूरत नहीं है, लेकिन मैं काम नहीं कर सकता एक नकली SocketClient की आपूर्ति करके इस वर्ग के लिए इकाई परीक्षण लिखने में सक्षम होना चाहते हैं ScalaMock के साथ यह कैसे करें।

मेरे परीक्षण कोड इस तरह दिखता है:

val t = new XScanner[SocketClient](confPath, (s: String) => mock[SocketClient]) 
जाहिर

कि संकलन नहीं करेगा क्योंकि SocketClient एक तर्क के रूप सॉकेट में एक ऐसा पथ की उम्मीद है, लेकिन मैं mock[SocketClient(s)] फोन नहीं कर सकते क्योंकि है कि एक प्रकार की नहीं है और मैं यह कर सकते हैं mock[SocketClient](s) पर कॉल न करें क्योंकि नकली इस प्रकार के तर्कों को इसके तर्क के रूप में नहीं लेती है।

तो मैं अपने स्कैनर को पास करने के लिए एक नकली SocketClient फैक्ट्री कैसे लिख सकता हूं? मैं यह भी काम नहीं कर सकता कि तर्क लेने वाले वर्ग को कैसे नकल करना है!

+0

मैं स्कैलामोक का लेखक हूं। स्कैला का कौन सा संस्करण और स्कैलामोक का कौन सा संस्करण आप उपयोग कर रहे हैं? ScalaMock2 बनाम ScalaMock3 के लिए उत्तर अलग हैं। –

+0

स्कैला के साथ स्कैला मॉक 3 2.10.0 – jangoolie

उत्तर

3

अंतर्दृष्टि यह है कि आपको नकली करने की आवश्यकता है socketClientFactory है। और फिर इसे एक नकली SocketClient वापस करने के लिए सेट अप करें।

को देखते हुए:

trait SocketClient { 
    def frobnicate(): Unit 
} 

class ScannerBase(path: String) 

class XScanner[T <: SocketClient](
    confPath: String = "/etc/default/configPath", 
    socketClientFactory: String => T 
) extends ScannerBase(confPath) { 
    val socket = socketClientFactory("Some Socket Name") 
    socket.frobnicate 
} 

(ओर ध्यान दें - confPath के लिए अपने डिफ़ॉल्ट मूल्य socketClientFactory के लिए कोई डिफ़ॉल्ट मान है, क्योंकि कभी नहीं इस्तेमाल किया जा सकता है)।

तो यह आपके आरंभ करने चाहिए (इस स्काला 2.9.x और साथ है ScalaMock2 - ScalaMock3 साथ 2.10.x थोड़ा अलग होगा, लेकिन बहुत ज्यादा नहीं तो):

import org.scalatest.FunSuite 
import org.scalamock.scalatest.MockFactory 
import org.scalamock.generated.GeneratedMockFactory 

class ScannerTest extends FunSuite with MockFactory with GeneratedMockFactory { 

    test("scanner") { 
    val mockFactory = mockFunction[String, SocketClient] 
    val mockClient = mock[SocketClient] 
    mockFactory.expects("Some Socket Name").returning(mockClient) 
    mockClient.expects.frobnicate 
    val scanner = new XScanner("path/to/config", mockFactory) 
    } 
} 

पूर्णता के लिए, यहाँ एक ही है स्कैला 2.10.0 और स्कैलामोक 3:

import org.scalatest.FunSuite 
import org.scalamock.scalatest.MockFactory 

class ScannerTest extends FunSuite with MockFactory { 

    test("scanner") { 
    val mockFactory = mockFunction[String, SocketClient] 
    val mockClient = mock[SocketClient] 
    mockFactory.expects("Some Socket Name").returning(mockClient) 
    (mockClient.frobnicate _).expects() 
    val scanner = new XScanner("path/to/config", mockFactory) 
    } 
} 
+0

मुझे यकीन नहीं है कि यह इस तथ्य को कैसे खत्म करता है कि सॉकेट क्लाइंट 1 तर्क लेता है। मैं नहीं लिख सकते हैं: वैल mockClient = नकली [SocketClient] mockFactory.expects ("कुछ सॉकेट नाम") लौटने (mockClient) क्योंकि नकली [SocketClient] संकलन नहीं होंगे।। क्या आप सुझाव दे रहे हैं कि मैं सॉकेट क्लाइंट को कोई तर्क लेने या सभी तर्कों के लिए डिफ़ॉल्ट मान रखने के लिए संशोधित करता हूं? भले ही कोई चूक न हो। बीटीडब्ल्यू का जवाब देने के लिए बहुत बहुत धन्यवाद। – jangoolie

+1

आह, क्षमा करें - मुझे पहली बार उस झुर्रियों को याद आया। अभी, ScalaMock3 केवल गुणों और नो-Args कक्षाओं नकली कर सकते हैं। लेकिन यदि आप सॉकेट क्लाइंट को नियंत्रित करते हैं, तो आपको अभी भी ठीक होना चाहिए - एक विशेषता बनाएं जो विधियों को परिभाषित करे और इसे अपनी कक्षा में कार्यान्वित करें: विशेषता सॉकेट क्लाइंटबेस; वर्ग सॉकेट क्लाइंट (...) सॉकेट क्लाइंटबेस बढ़ाता है। तो आप सॉकेट क्लाइंटबेस को मॉक कर सकते हैं और आपको अच्छा होना चाहिए? या क्या मैं कुछ न कुछ भूल रहा हूं? –

+0

ध्यान दें कि अगर मैं आपके कोड को बिल्कुल कॉपी करता हूं तो भी मैं इसे संकलित नहीं कर सकता।मुझे मिलता है: ओवरराइडिंग विधि नेस्टेड विशेषता प्रकार में सूटमैक्सिन प्रकार => scala.collection.immutable.IndexedSeq [org.scalatest.Suite]; [त्रुटि] विधि नेस्टेड विशेषता में सूट प्रकार की सूट => सूची [org.scalatest.Suite] असंगत प्रकार [त्रुटि] वर्ग स्कैनरटेस्ट मॉक फैक्ट्री के साथ FunSuite बढ़ाता है { – jangoolie

संबंधित मुद्दे