2010-05-17 19 views
14

इंटरफ़ेस से निपटने के लिए सही तरीका क्या है जो मोक के साथ सेट-केवल गुणों का पर्दाफाश करता है? पहले मैंने अन्य एक्सेसर को जोड़ा है लेकिन यह पूरे डोमेन में यादृच्छिक throw new NotImplementedException() कथन के साथ मेरे डोमेन में बहुत दूर है।Moq सही ढंग से केवल गुणों को सेट करने के लिए कैसे करें

मैं बस कुछ सरल की तरह क्या करना चाहते हैं:

mock.VerifySet(view => view.SetOnlyValue, Times.Never());

लेकिन इस The property 'SetOnlyValue' has no getter

+0

मैं उलझन में हूं, परीक्षण का उद्देश्य क्या है यदि संकलक इस तथ्य को उठाता है कि आप केवल एक लेख लिखने पर गेटर को कॉल करने का प्रयास करते हैं? मुझे यकीन है कि मैं यहां कुछ खो रहा हूं, शायद ओपी से स्पष्टीकरण? –

+1

@ इगोर ज़्वकाका और अन्य: 'देखें => देखें .etOnlyValue' उत्पन्न करता है 'संपत्ति' SetOnlyValue 'कोई गेटर नहीं है'। ऐसा इसलिए है क्योंकि कोड के इस टुकड़े को गेटर के लिए कॉल के रूप में व्याख्या किया जा रहा है। रीड-राइट केस में, 'VerifySet' अभिव्यक्ति चलता है और आंकड़े बताता है कि संपत्ति के सेटटर पर क्या अपेक्षा है। केवल-पढ़ने के मामले में, यह एक कंपाइलर त्रुटि में चलाता है। हमें यह मानने की जरूरत है कि ओपी यहां बेवकूफ नहीं है और खुद के लिए काम करने की कोशिश नहीं कर रहा है और इसके बजाय पूछ रहा है कि 'मैं अतिरिक्त जंक करने से कैसे बचूं'। –

+2

ओह मुझे यह मिल गया। तो यह moq में एक सत्यापन स्थापित करने के बारे में था जो किसी संपत्ति पर भरोसा नहीं करता था, जो कि गेटटर की आवश्यकता है, सही? –

उत्तर

18
public class Xyz 
{ 
    public virtual string AA { set{} } 
} 
public class VerifySyntax 
{ 
    [Fact] 
    public void ThisIsHow() 
    { 
     var xyz = new Mock<Xyz>(); 
     xyz.Object.AA = "bb"; 
     // Throws: 
     xyz.VerifySet(s => s.AA = It.IsAny<string>(), Times.Never()); 
    } 
} 
public class SetupSyntax 
{ 
    [Fact] 
    public void ThisIsHow() 
    { 
     var xyz = new Mock<Xyz>(); 
     xyz.SetupSet(s => s.AA = It.IsAny<string>()).Throws(new InvalidOperationException()); 
     Assert.Throws<InvalidOperationException>(() => xyz.Object.AA = "bb"); 
    } 
} 
+0

+1 के लिए धन्यवाद - इसे पढ़ने के बाद, मैंने अपना जवाब हटा दिया क्योंकि ऐसा लगता है कि ओपी क्या चाहता है। – Lee

+0

@Lee: कूल, टा (मुझे पता है कि मैंने सवाल को भी दो बार पढ़ा है!) –

+0

धन्यवाद रूबेन, मैंने यादृच्छिक रूप से एक इट डालने का फैसला नहीं किया होगा। किसी भी पंक्ति के बगल में कोई अभिव्यक्ति कहती है कि एक संकलन त्रुटि है! –

2

धन्यवाद रूबेन का एक संकलन त्रुटि पैदावार!

Public Interface Xyz 
    WriteOnly Property AA As String 
End Interface 
Public Class VerifySyntax 
    <Fact()> 
    Public Sub ThisIsHow() 
     Dim xyz = New Mock(Of Xyz) 
     xyz.Object.AA = "bb" 
     ' Throws: 
     xyz.VerifySet(Sub(s) s.AA = It.IsAny(Of String)(), Times.Never()) 
    End Sub 
End Class 
Public Class SetupSyntax 
    <Fact()> 
    Public Sub ThisIsHow() 
     Dim xyz = New Mock(Of Xyz) 
     xyz.SetupSet(Sub(s) s.AA = It.IsAny(Of String)()).Throws(New InvalidOperationException()) 
     Assert.Throws(Of InvalidOperationException)(Sub() xyz.Object.AA = "bb") 
    End Sub 
End Class 

यहां महत्वपूर्ण यह है कि आप एक एकल लाइन समारोह का उपयोग नहीं कर रहा है:

और एक VB.Net में किसी की सहायता करने के लिए पकड़ लिया इस VB.Net में एक ही कोड है लैम्बडा क्योंकि इसे एक अभिव्यक्ति के रूप में व्याख्या किया जाएगा जो आपके द्वारा किए गए असाइनमेंट स्टेटमेंट के बजाए एक मान देता है। इस के बाद से VB.Net न केवल काम के लिए बल्कि समानता तुलना के लिए एक बराबर के चिह्न का उपयोग करता है, और इसलिए s.AA-मूल्य और की एक बूलियन तुलना के रूप में व्याख्या की जाएगी

 xyz.VerifySet(Function(s) s.AA = It.IsAny(Of String)(), Times.Never()) 

करने का प्रयास कर रहा है It.Isny (स्ट्रिंग का)(), इस प्रकार गेटटर का आह्वान करता है, जो फिर से एक संकलन त्रुटि में परिणाम देगा। इसके बजाय आप उप लैम्ब्डा (या संभवतः एक बहु-पंक्ति फ़ंक्शन लैम्ब्डा) का उपयोग करना चाहते हैं।

यदि आपके पास संपत्ति पर गेटटर है, हालांकि, एक समारोह लैम्ब्डा अभी भी काम करेगा।

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