2010-09-24 8 views
7

मैं इस इकाई बने रहने की NHibernate उपयोग कर रहा हूँ:मैं यूनिट परीक्षण संरक्षित गुणों को केवल एनएचबेरनेट द्वारा सेट करने के लिए कैसे उपयोग करूं?

public class Store 
{ 
    public int Id { get; protected set; } 
    public int Name { get; set; } 
} 

नोट कैसे Id संपत्ति एक संरक्षित सेटर है। यह उपयोगकर्ताओं को Id बदलने से रोकने के लिए है, जबकि एनएचबीर्नेट को इसे Id असाइन करने की अनुमति देता है जब यह डेटाबेस में सहेजता है।

मेरी इकाई परीक्षण में से एक में, मैं निम्नलिखित कोड के साथ Moq उपयोग कर रहा हूँ मेरी भंडार बाहर उपहास करने के लिए:

var mock = new Mock<IRepository>(); 
mock.Setup(x => x.GetById<Store>(It.IsAny<int>())) 
    .Returns(new Store { Value = "Walmart" }); // can't set the ID here 

var store = Repository.GetById<Store>(5); 
Assert.That(store.Id == 5); 

जब मैं Moq बता एक नया Store उदाहरण वापस जाने के लिए, मैं असाइन नहीं कर सकते आईडी, और यूनिट परीक्षण विफल रहता है। मैं इस संपत्ति का परीक्षण कैसे करूं? मैं संपत्ति के पहुंच स्तर को बदलना नहीं चाहता क्योंकि मैं नहीं चाहता कि उपयोगकर्ता इसे मैन्युअल रूप से बदल दें, और फिर भी यह ठीक है कि मुझे इसका परीक्षण करने के लिए यहां क्या करना है।

उत्तर

8

आप वास्तव में स्टोर वर्ग का परीक्षण नहीं करते हैं, तो यह नकली है, और SetupGet विधि का उपयोग करें:

var mock = new Mock<IRepository>(); 
var mockStore = new Mock<Store>(); 
mock.Setup(x => x.GetById<Store>(It.IsAny<int>())).Returns(mockStore.Object); 

mockStore.SetupGet(s => s.Id).Returns(5); 
mockStore.SetupGet(s => s.Value).Returns("Walmart"); 

var store = Repository.GetById<Store>(5); 
Assert.That(store.Id == 5); 
+0

धन्यवाद, मैं कभी नहीं स्टोर ऑब्जेक्ट को खुद मजाक कर रहा है! –

+1

आपका स्वागत है। मैं आमतौर पर इंटरफेस के साथ इसका उपयोग करता हूं, लेकिन चूंकि आपके पास पहले से ही एनएचबीर्नेट के लिए वर्चुअल सब कुछ होना चाहिए, वैसे भी यह एक बहुत अच्छा फिट है। – arootbeer

3

परीक्षण प्रोजेक्ट में Store का एक बाल वर्ग बनाएं जो संरक्षित गुणों के अनुकूलन की अनुमति देता है।

class TestableStore : Store { 
    public int TestableId { 
    get { return Id; } 
    set { Id = value; } 
    } 
} 

तो सेटअप अपने इकाई परीक्षण इस उदाहरण लौट उपयोग करने के लिए जब आप एक Store वस्तु का निर्माण करने की जरूरत है।

mock 
    .Setup(x => x.GetById<Store>(It.IsAny<int>())) 
    .Returns(new TestableStore { Value = "Walmart", TestableId=42 }); 
+0

FYI करें, बस (मैं पर्याप्त शक्तिशाली संपादित करने के लिए नहीं कर रहा हूँ :() – aqwert

+0

आधार वर्ग के रूप में स्टोर वर्ग को जोड़ने के लिए doh @aqwert, जरूरत है! धन्यवाद अद्यतन – JaredPar

+0

शानदार! पुरानी पोस्ट लेकिन उपयोगी बनाया! – boolean

10

बस इस बाहर वहाँ फेंकने के लिए एक और दृष्टिकोण के रूप में, आप सेटर बना सकता है protected internal:

public class Store 
{ 
    public int Id { get; protected internal set; } 
    public int Name { get; set; } 
} 

और InternalsVisibleTo विशेषता का उपयोग:

[assembly: InternalsVisibleTo("StoreUnitTests")] 
+0

हे, यह बहुत अच्छा है। पहले। –

1

निश्चित रूप से सबसे अच्छा तरीका नहीं है, लेकिन आप Sharp Architecture's परीक्षणों में किए गए संपत्ति को सेट करने के लिए प्रतिबिंब का उपयोग भी कर सकते हैं।

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

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