Saya memiliki Tes Unit, yang terlihat seperti ini:
[Test]
public void Should_create_person()
{
Assert.DoesNotThrow(() => new Person(Guid.NewGuid(), new DateTime(1972, 01, 01));
}
Saya menyatakan bahwa objek Orang dibuat di sini yaitu validasi yang tidak gagal. Misalnya, jika Guid adalah nol atau tanggal lahir lebih awal dari 01/01/1900, maka validasi akan gagal dan pengecualian akan dilempar (artinya tes gagal).
Konstruktornya terlihat seperti ini:
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;
}
Apakah ini ide yang bagus untuk ujian?
Catatan : Saya mengikuti pendekatan Klasikis untuk Unit Menguji Model Domain jika itu berlaku.
c#
unit-testing
constructors
w0051977
sumber
sumber
Should_create_person
? Apa yang harus membuat seseorang? Berikan nama yang bermakna, misalnyaCreating_person_with_valid_data_succeeds
.Jawaban:
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:
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:
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:
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.
sumber
PersonBirthdate
) Yang melakukan validasi tanggal lahir. Demikian pulaGuid
cek dapat diimplementasikan diId
kelas. Ini berarti Anda benar-benar tidak perlu lagi memiliki logika validasi dalamPerson
konstruktor karena tidak mungkin untuk membangunnya dengan data yang tidak valid - kecuali untuknull
referensi. Tentu saja, Anda harus menulis tes untuk dua kelas lainnya :)Sudah jawaban yang bagus di sini, tapi saya pikir satu hal tambahan yang layak disebut.
Ketika melakukan TDD "oleh buku", orang perlu menulis tes pertama yang memanggil konstruktor, bahkan sebelum konstruktor diimplementasikan. Tes itu bisa benar-benar terlihat seperti yang Anda sajikan, bahkan jika akan ada nol logika validasi di dalam implementasi konstruktor.
Perhatikan juga bahwa untuk TDD, seseorang harus menulis tes lain dulu seperti
sebelum menambahkan tanda centang
DateTime(1900,01,01)
ke konstruktor.Dalam konteks TDD, tes yang ditampilkan sangat masuk akal.
sumber