Ini adalah tes yang valid (meskipun agak terlalu bersemangat) dan saya kadang-kadang melakukannya untuk menguji logika konstruktor, namun seperti yang disebutkan Laiv dalam komentar Anda harus bertanya pada diri sendiri mengapa.
Jika konstruktor Anda terlihat seperti ini:
public Person(Guid guid, DateTime dob)
{
this.Guid = guid;
this.Dob = dob;
}
Apakah ada banyak gunanya menguji apakah itu melempar? Apakah parameter ditetapkan dengan benar, saya bisa mengerti tetapi tes Anda agak berlebihan.
Namun, jika tes Anda melakukan sesuatu seperti ini:
public Person(Guid guid, DateTime dob)
{
if(guid == default(Guid)) throw new ArgumentException("Guid is invalid");
if(dob == default(DateTime)) throw new ArgumentException("Dob is invalid");
this.Guid = guid;
this.Dob = dob;
}
Maka tes Anda menjadi lebih relevan (karena Anda benar-benar melemparkan pengecualian di suatu tempat dalam kode).
Satu hal yang akan saya katakan, umumnya praktik buruk memiliki banyak logika di konstruktor Anda. Validasi dasar (seperti cek null / default yang saya lakukan di atas) ok. Tetapi jika Anda terhubung ke database dan memuat data seseorang maka di situlah kode mulai benar-benar berbau ...
Karena itu, jika konstruktor Anda layak untuk diuji (karena ada banyak logika), maka mungkin ada hal lain yang salah.
Anda hampir pasti akan memiliki tes lain yang mencakup kelas ini di lapisan logika bisnis, konstruktor dan tugas variabel hampir pasti akan mendapatkan cakupan lengkap dari tes ini. Oleh karena itu mungkin ada gunanya menambahkan tes khusus khusus untuk konstruktor. Namun, tidak ada yang hitam dan putih dan saya tidak akan menentang pengujian ini jika saya meninjaunya - tapi saya akan mempertanyakan apakah mereka menambah banyak nilai di atas dan di luar tes di tempat lain dalam solusi Anda.
Dalam contoh Anda:
public Person(Id id, DateTime dateOfBirth) :
base(id)
{
if (dateOfBirth == null)
throw new ArgumentNullException("Date of Birth");
elseif (dateOfBith < new DateTime(1900,01,01)
throw new ArgumentException("Date of Birth");
DateOfBirth = dateOfBirth;
}
Anda tidak hanya melakukan validasi, tetapi Anda juga memanggil konstruktor dasar. Bagi saya ini memberikan lebih banyak alasan untuk melakukan tes ini karena mereka memiliki logika konstruktor / validasi sekarang dibagi menjadi dua kelas yang mengurangi visibilitas dan meningkatkan risiko perubahan tak terduga.
TLDR
Ada beberapa nilai untuk tes ini, namun logika validasi / penugasan kemungkinan akan ditanggung oleh tes lain dalam solusi Anda. Jika ada banyak logika di konstruktor ini yang memang memerlukan pengujian signifikan maka itu menunjukkan kepada saya ada bau kode jahat yang bersembunyi di sana.