मेरे डोमेन में इस तरह के बहुत सारे सरल अपरिवर्तनीय वर्ग हैं:
public class Person
{
public string FullName { get; }
public string NameAtBirth { get; }
public string TaxId { get; }
public PhoneNumber PhoneNumber { get; }
public Address Address { get; }
public Person(
string fullName,
string nameAtBirth,
string taxId,
PhoneNumber phoneNumber,
Address address)
{
if (fullName == null)
throw new ArgumentNullException(nameof(fullName));
if (nameAtBirth == null)
throw new ArgumentNullException(nameof(nameAtBirth));
if (taxId == null)
throw new ArgumentNullException(nameof(taxId));
if (phoneNumber == null)
throw new ArgumentNullException(nameof(phoneNumber));
if (address == null)
throw new ArgumentNullException(nameof(address));
FullName = fullName;
NameAtBirth = nameAtBirth;
TaxId = taxId;
PhoneNumber = phoneNumber;
Address = address;
}
}
अशक्त चेक और प्रॉपर्टी इनिशियलाइज़ेशन लिखना पहले से ही बहुत थकाऊ हो रहा है, लेकिन वर्तमान में मैं इन वर्गों में से प्रत्येक के लिए यूनिट टेस्ट लिखता हूं ताकि यह सत्यापित किया जा सके कि तर्क सत्यापन सही ढंग से काम करता है और सभी संपत्तियों को आरंभीकृत किया जाता है। यह बहुत ही उबाऊ व्यस्तता के साथ लगता है जैसे कि लाभहीन लाभ के साथ।
वास्तविक समाधान C # के लिए अपरिवर्तनीयता और गैर-अशक्त संदर्भ प्रकारों को मूल रूप से समर्थन करने के लिए होगा। लेकिन इस बीच स्थिति को सुधारने के लिए मैं क्या कर सकता हूं? क्या यह इन सभी परीक्षणों को लिखने के लायक है? क्या इस तरह की कक्षाओं के लिए कोड जनरेटर लिखना बेहतर होगा, जिसमें से प्रत्येक के लिए परीक्षण लिखने से बचें?
यहाँ मैं अब जवाब के आधार पर क्या है।
मैं इस तरह देखने के लिए अशक्त जांच और संपत्ति आरंभीकरण को आसान बना सकता है:
FullName = fullName.ThrowIfNull(nameof(fullName));
NameAtBirth = nameAtBirth.ThrowIfNull(nameof(nameAtBirth));
TaxId = taxId.ThrowIfNull(nameof(taxId));
PhoneNumber = phoneNumber.ThrowIfNull(nameof(phoneNumber));
Address = address.ThrowIfNull(nameof(address));
रॉबर्ट हार्वे द्वारा निम्नलिखित कार्यान्वयन का उपयोग करना :
public static class ArgumentValidationExtensions
{
public static T ThrowIfNull<T>(this T o, string paramName) where T : class
{
if (o == null)
throw new ArgumentNullException(paramName);
return o;
}
}
अशक्त जाँच का उपयोग करना आसान GuardClauseAssertion
है AutoFixture.Idioms
(सुझाव के लिए धन्यवाद, एसेन स्कोव पेडर्सन ):
var fixture = new Fixture().Customize(new AutoMoqCustomization());
var assertion = new GuardClauseAssertion(fixture);
assertion.Verify(typeof(Address).GetConstructors());
इसे और भी संकुचित किया जा सकता है:
typeof(Address).ShouldNotAcceptNullConstructorArguments();
इस विस्तार विधि का उपयोग करना:
public static void ShouldNotAcceptNullConstructorArguments(this Type type)
{
var fixture = new Fixture().Customize(new AutoMoqCustomization());
var assertion = new GuardClauseAssertion(fixture);
assertion.Verify(type.GetConstructors());
}