Alan adım şöyle basit değişmez sınıflardan oluşur:
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;
}
}
Boş kontroller ve özellik başlatma yazma zaten çok sıkıcı oluyor ama şu anda argüman doğrulamanın doğru çalıştığını ve tüm özelliklerin başlatıldığını doğrulamak için bu sınıfların her biri için birim testleri yazıyorum . Bu orantısız fayda ile son derece sıkıcı meşgul işi gibi geliyor.
Asıl çözüm, C # 'ın doğal olarak değişmezliği ve null olmayan referans tiplerini desteklemesi olacaktır. Ancak bu arada durumu iyileştirmek için ne yapabilirim? Tüm bu testleri yazmaya değer mi? Her biri için test yazmaktan kaçınmak için bu tür sınıflar için bir kod üreteci yazmak iyi bir fikir olabilir mi?
İşte cevaplara dayanarak sahip olduğum şey.
Ben null denetimleri ve özellik başlatma gibi basitleştirmek için basitleştirmek olabilir:
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));
Robert Harvey'in aşağıdaki uygulamasını kullanarak :
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;
}
}
Boş çekler test kullanılarak kolayca GuardClauseAssertion
dan AutoFixture.Idioms
(öneriye, sayesinde Esben Skov Pedersen ):
var fixture = new Fixture().Customize(new AutoMoqCustomization());
var assertion = new GuardClauseAssertion(fixture);
assertion.Verify(typeof(Address).GetConstructors());
Bu daha da sıkıştırılabilir:
typeof(Address).ShouldNotAcceptNullConstructorArguments();
Bu uzantı yöntemini kullanarak:
public static void ShouldNotAcceptNullConstructorArguments(this Type type)
{
var fixture = new Fixture().Customize(new AutoMoqCustomization());
var assertion = new GuardClauseAssertion(fixture);
assertion.Verify(type.GetConstructors());
}