2016-04-29 12 views
8

वर्तमान में अपने प्रोजेक्ट का एक हिस्सा नीचे की तरह एक डोमेन वस्तु मौजूद है के साथ परीक्षण गुण:निजी setters

public class Address 
{ 
    public virtual string HouseName { get; set; } 

    public virtual string HouseNumber { get; set; } 

    public virtual string RoadName { get; set; } 

    public virtual string Postcode { get; set; } 

    public virtual string District { get; private set; } 
} 

जिला संपत्ति डेटाबेस में एक गणना स्तंभ है। डेटा एक्सेस प्रदाता (इकाई फ्रेमवर्क) की आवश्यकताओं के कारण एक निजी सेट की आवश्यकता है।

: के रूप में जिला कभी नहीं की वजह से जब कोई पता रिकॉर्ड सहेजा जाता है यह अपडेट किया जा रहा/डेटाबेस में अद्यतन

एक विधि है कि मैं परीक्षण करना चाहते हैं इस तरह दिखता है, निर्धारित करने की आवश्यकता यह सामान्य कार्यक्रम के प्रवाह में ठीक है

public IEnumerable<House> GetHousesWithinSameDistrict (int addressId) 
{ 
    var addressToMatch = _addressRepository 
     .FirstOrDefault(address => address.Id == addressId) 

    return _houseRepository 
     .Where(house => house.Address.District == addressToMatch.District) 
} 

यह मुझे समस्याएं पैदा कर रहा है जब मैं पता टॉमैच चर सेट अप करने का प्रयास करता हूं, क्योंकि मैं जिला संपत्ति सेट करने में असमर्थ हूं और इस तरह मैं सही मिलान पते को जांचने के लिए एक परीक्षण नहीं लिख सकता हूं।

इस परीक्षण के लिए मुझे पता वस्तु सेट करने के बारे में कैसे जाना चाहिए?

+0

हो सकता है, 'संरक्षित internal' +' विधानसभा: InternalsVisibleTo'? –

+0

@ DeblatonJean-Philippe संबंधित, लेकिन निश्चित रूप से कोई डुप्लिकेट IMHO नहीं है। – Jeroen

+0

@ डेब्लैटन जीन-फिलिप उस पर एक डुप्लिकेट नहीं है। – FLSH

उत्तर

5

अगर आप Moq उपयोग कर रहे हैं तरीके से काम करता है (जो प्रश्न के साथ टैग है, इसलिए मुझे लगता है कि आप कर रहे हैं):

var mockAddress = new Mock<Address>(); 
mockAddress.SetupGet(p => p.District).Returns("Whatever you want to match"); 

तो अधिक पूर्ण उदाहरण है:

var mockAddress = new Mock<Address>(); 
mockAddress.SetupGet(p => p.Id).Returns(42); 
mockAddress.SetupGet(p => p.District).Returns("What you want to match"); 

var mockAddressRepository = new Mock<IRepository<Address>>(); 
var addresses = new List<Address> { mockAddress.Object }; 
mockAddressRepository.Setup(p => p.GetEnumerator()).Returns(addresses.GetEnumerator()); 

var addressToMatch = mockAddressRepository.Object.FirstOrDefault(address => address.Id == 42); 
Console.WriteLine(addressToMatch.District); 

यह उम्मीद मूल्य आउटपुट:

What you want to match 
1

सबसे पहले, एक जंगली अनुमान: शायद protected internal के रूप में अपने District प्रॉपर्टी घोषित करने के साथ साथ अपने "डोमेन" विधानसभा Distinct अपने परीक्षण से सेट किया जा सकता है, ताकि के लिए एक assembly:InternalsVisibleTo विशेषता जोड़ने का एक संयोजन।

class Address 
{ 
    public virtual string District { get; protected internal set; } 
} 

फिर, आप अपने Address वर्ग के लिए एक आंतरिक निर्माता जोड़ सकते हैं, जो District संपत्ति का मूल्य निर्धारित किया जाएगा। और फिर, assembly:InternalsVisibleTo के साथ अपनी "डोमेन" असेंबली को एनोटेट करें।

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