Haruskah kita mengejek entitas dan menilai objek saat melakukan DDD?

9

Setelah membaca beberapa artikel tentang newable vs Suntik benda dan bagaimana konsep-konsep ini berhubungan dengan layanan DDD ini, entitas dan objek nilai, aku ditinggalkan dengan beberapa keraguan tentang menggunakan newables dalam kode saya terutama di unit test.

Kandidat utama untuk newables adalah Entitas dan Objek nilai yang berarti bahwa alih-alih menyuntikkan dependensi ini ke objek lain, Anda hanya perlu newmembuat instance dari objek-objek ini dan menggunakannya secara langsung dalam kode.

Namun, praktik-praktik DDD yang baik mengadvokasi penugasan tanggung jawab kepada entitas dan nilai objek jika dianggap tepat. Jadi entitas dan objek nilai akan berakhir dengan beberapa logika bisnis yang serius di dalamnya.

Sekarang jika suatu layanan beroperasi pada suatu entitas atau objek nilai haruskah saya mengejek entitas atau objek nilai dan meneruskan tiruan itu ke layanan (mengejek akan membutuhkan interfaceobjek nilai atau entitas yang tampaknya dianjurkan)?

Atau haruskah saya hanya objek newentitas / nilai dan melewati implementasi konkret ke layanan dan dengan demikian melanggar prinsip pengujian unit pengujian hanya satu unit?

Songo
sumber
Terkait: stackoverflow.com/q/2833422
Robert Harvey
Itu tergantung jika Anda seorang penguji klasik atau mockist: martinfowler.com/articles/mocksArentStubs.html
jhewlett
@jhewlett Seorang klasikis tidak akan mengejek apa pun; seorang mockist kemungkinan besar hanya akan mengolok-olok Layanan, Repositori, dan Pabrik (yang merupakan "injeksi"), tidak pernah Entitas atau Objek Nilai (yang merupakan "newabel").
Rogério
@ Rogério, ketika Anda mengatakan Layanan; maksud Anda Layanan Aplikasi atau Layanan Domain?
w0051977
@Songo, apa yang Anda putuskan? Apakah Anda mengejek: Entitas; Nilai Objek dan Layanan Domain?
w0051977

Jawaban:

11

Saya membaca bahwa Anda berpendapat bahwa unit test, seperti objek SOLID, harus memiliki "satu alasan untuk dilanggar". Itu adalah tujuan mulia, tetapi saya pikir Anda akan menemukan bahwa dalam banyak kasus itu sama sekali tidak layak. Salah satu kasus tersebut ada di sini, di mana Anda memiliki objek domain "kaya" (DDD membedakan antara Entitas dan Objek Nilai, yang keduanya terdiri dari "model domain") yang merupakan ketergantungan sistem yang sedang diuji.

Dalam situasi ini, saya memiliki filosofi yang diberikanobjek domain memiliki cakupan tes unit komprehensif sendiri, percaya bahwa objek akan bekerja seperti yang dirancang dalam tes unit untuk SUT yang berbeda tidak selalu melanggar tes unit. Jika tes ini rusak karena perubahan pada domain, maka saya akan berharap tes unit objek domain juga rusak, menuntun saya ke arah sesuatu untuk diselidiki. Jika pengujian unit objek domain telah diperbarui dengan benar sebagai tes merah, kemudian dibuat hijau dengan perubahan, dan tes lainnya ini gagal, itu tidak selalu merupakan hal yang buruk juga; itu berarti bahwa harapan dari pengujian yang lain ini bertentangan dengan harapan baru untuk domain, dan saya harus memastikan keduanya setuju satu sama lain dan kriteria penerimaan yang menyeluruh dari sistem.

Karena itu, saya hanya akan mengejek objek domain jika objek domain tersebut menghasilkan "efek samping" yang tidak diinginkan dari perspektif unit-testing (yaitu menyentuh sumber daya eksternal seperti penyimpanan data), atau jika logika objek domain cukup kompleks sehingga menempatkannya dalam kondisi yang tepat untuk ujian menjadi penghalang untuk menentukan dan lulus ujian.

Itu kemudian menjadi pertanyaan pendorong; mana yang lebih mudah? Untuk menggunakan objek domain untuk tujuan yang dimaksudkan dalam pengujian, atau mengejeknya? Lakukan yang mana yang lebih mudah, sampai bukan lagi pilihan yang lebih mudah, seperti ketika perubahan fungsional memecah pengujian layanan dengan cara yang kompleks; jika ini terjadi, maka tulis ulang tes untuk menghasilkan tiruan yang memperlihatkan persyaratan fungsional yang bergantung pada layanan, tanpa kerumitan yang memecahkannya.

Memahami bahwa bagaimanapun juga, harus ada tes integrasi yang menggunakan objek domain nyata dicolokkan ke layanan nyata yang menguji interaksi antara keduanya pada tingkat abstraksi yang lebih tinggi (seperti pengujian, misalnya, tidak hanya fungsi di balik layanan endpoint, tetapi proxy yang melaluinya objek domain diserialisasi dan dikirim).

KeithS
sumber
Di DDD, "model domain" juga mencakup Layanan Domain, Gudang, dan Pabrik, bukan hanya Entitas dan Objek Nilai.
Rogério
0

Mempercayai kelas dependen bahwa ia berfungsi dengan baik, berharap ada yang gagal beberapa unit test ketika sesuatu di sana tidak bekerja, maka ini harus diuji sangat cepat . Mungkin ada yang hilang beberapa unit test penting? Mungkin ada kasus yang belum diuji yang akan membuat kesalahan, yang akan diproduksi di kelas pengujian asal saya, dan tidak akan ditangkap dalam kelas dependen itu sendiri.

Jadi menurut pendapat saya untuk unit test, kelas dependen harus diejek. Jika tidak melakukannya, maka ini merupakan tes integrasi.

Fabian Picone
sumber