Tên miền của tôi bao gồm rất nhiều lớp bất biến đơn giản như thế này:
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;
}
}
Viết séc null và khởi tạo thuộc tính đã trở nên rất tẻ nhạt nhưng hiện tại tôi viết kiểm tra đơn vị cho từng lớp này để xác minh rằng xác thực đối số hoạt động chính xác và tất cả các thuộc tính được khởi tạo. Điều này cảm thấy như bận rộn vô cùng nhàm chán với lợi ích không tương xứng.
Giải pháp thực sự sẽ là C # để hỗ trợ các kiểu tham chiếu không thay đổi và không thể rỗng. Nhưng tôi có thể làm gì để cải thiện tình hình trong lúc này? Có đáng để viết tất cả các bài kiểm tra này? Sẽ là một ý tưởng tốt để viết một trình tạo mã cho các lớp như vậy để tránh viết các bài kiểm tra cho từng người trong số họ?
Đây là những gì tôi có bây giờ dựa trên các câu trả lời.
Tôi có thể đơn giản hóa kiểm tra null và khởi tạo thuộc tính để trông như thế này:
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));
Sử dụng triển khai sau đây của Robert Harvey :
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;
}
}
Kiểm tra kiểm tra null rất dễ dàng bằng cách sử dụng GuardClauseAssertion
từ AutoFixture.Idioms
(cảm ơn vì gợi ý, Esben Skov Pedersen ):
var fixture = new Fixture().Customize(new AutoMoqCustomization());
var assertion = new GuardClauseAssertion(fixture);
assertion.Verify(typeof(Address).GetConstructors());
Điều này có thể được nén hơn nữa:
typeof(Address).ShouldNotAcceptNullConstructorArguments();
Sử dụng phương pháp mở rộng này:
public static void ShouldNotAcceptNullConstructorArguments(this Type type)
{
var fixture = new Fixture().Customize(new AutoMoqCustomization());
var assertion = new GuardClauseAssertion(fixture);
assertion.Verify(type.GetConstructors());
}