2011-07-28 9 views
7

असल में, यदि मैं एमवीवीएम का उपयोग करता हूं और सार्वजनिक आईसीएमंड्स का पर्दाफाश करता हूं, तो क्या मेरे प्रतिनिधि सार्वजनिक या निजी हो सकते हैं?डब्ल्यूपीएफ एमवीवीएम - यूनिट एक कमांड का परीक्षण - निजी बनाम सार्वजनिक तरीकों?

उत्तर

11

मैं उन्हें निजी बनाना होगा - वे आपकी कक्षा के public interface का हिस्सा नहीं हैं, यही सार्वजनिक आईसीओएमएंड गुणों के लिए है।

+0

+1 सार्वजनिक इंटरफ़ेस का परीक्षण करें। –

+0

मेरी कक्षा में इंटरफेस नहीं है, हालांकि यह सिर्फ एक वर्ग है। – michael

+3

@michael कक्षा में 'सार्वजनिक' विधियों और गुणों का संग्रह माना जाता है कि कक्षा का "इंटरफ़ेस", जैसा कि उपभोक्ता उस वर्ग के साथ इंटरफेस करते हैं। – dlev

4

व्यक्तिगत रूप से, मैं निजी तरीकों से जाऊंगा और मैं आपको बताउंगा क्यों। आप ICommand का पर्दाफाश कर रहे हैं, जो मेरे लिए कहता है कि उपभोग करने वाले दृश्य को निष्पादन कॉल करने से पहले CanExecute को कॉल करना चाहिए। यदि वे नहीं करते हैं, तो वे एपीआई के खिलाफ जा रहे हैं और खुद को पैर में शूटिंग कर रहे हैं और उस समय यह आपके हाथों से बाहर है। जैसे किसी ने किसी महत्वपूर्ण निजी चर को शून्य पर सेट करने के लिए प्रतिबिंब का उपयोग किया और इस वजह से अपने वर्ग के डिजाइन को तोड़ दिया ... खुद को पैर में शूटिंग। तो सदस्यों को निजी क्यों बनाते हैं? क्योंकि उन सदस्यों को बेनकाब करने की कोई आवश्यकता नहीं है जिन्हें सीधे नहीं कहा जाना चाहिए।


मूल रूप से, जब आप इकाई के सदस्यों तुम इतनी अलग-अलग मत करो का परीक्षण, तो आप ऐसा रास्ता एपीआई का इरादा रखता सदस्यों के लिए निष्पादित करने के लिए में है। तो, क्या तुम सच में सदस्यों का परीक्षण कर रहे है, लेकिन इसके अलावा आप आदेश है, जो फिर से मतलब है कि वे की विशेष क्रम में एक जोड़ी में परीक्षण किया जाना चाहिए परीक्षण कर रहे हैं:

if (CanExecute) 
{ 
    Execute; 
} 
+0

काफी एक संपादन का परीक्षण - या मैं बस कुछ याद किया ? :) –

+0

@ चतुरता: कभी-कभी मैं रताता हूं। मैंने यूनिट परीक्षण की बात आने से पहले कुछ ऐसा पूछा है और किसी ने मुझे बताया है कि अगर लोग एपीआई के खिलाफ जाते हैं तो यह उन पर है। आप किसी को उचित पुस्तकालय या ऐप को नष्ट करने से बचाने के लिए अभी तक जा सकते हैं। –

2

मेरे पास वृद्धि, घटाने वाले बटन और स्लाइडर शो मान के कुछ सरल नियंत्रण के लिए एमवीवीएम है।

आप परीक्षण ICommand और INotifyPropertyChanged है, तो आप unittest की तरह कर सकते हैं:

[TestMethod] 
public void TestViewModel3() 
{ 
    int min = -10; 
    int max = 10000; 
    int initVal = 50; 
    bool initState = false; 

    ToglledSliderModel model = new ToglledSliderModel(initState, initVal, min, max); 
    ToglledSliderViewModel viewModel = new ToglledSliderViewModel(); 
    viewModel.Model = model; 

    int status = 567; 
    viewModel.PropertyChanged += delegate 
    { 
     status = 234; 
    }; 

    for (int i = 1; i < 100; i++) 
    { 
     status = 567; 
     ICommand ic = viewModel.IncreaseValue; 
     ic.Execute(this); 
     Thread.Sleep(2); 
     Assert.AreEqual(status, 234); 
     Assert.AreEqual(model.SliderValue, initVal + i); 
    } 
} 

आप देख सकते हैं, मैं INotifyPropertyChanged व्यवहार और ICommand को क्रियान्वित करने

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