DDD yaparken varlıkları alay etmeli ve nesnelere değer vermeli miyiz?


9

Bir okuduktan sonra birkaç makaleleri hakkında Newable vs Enjekte nesneler ve bunların nasıl kavramlar DDD hizmetlerinden, varlıkları ve değer nesneler ile ilgilidir, özellikle benim birim testlerinde benim kodunda newables kullanımı hakkında bazı şüpheler bırakıldı.

Yenilenebilirler için ana adaylar Varlıklar ve Değer nesneleridir, yani bu bağımlılıkları başka nesnelere enjekte etmek yerine bu nesnelerin sadece newbir örneğini kullanmalı ve bunları doğrudan kodda kullanmalıdır.

Bununla birlikte, iyi DDD uygulamaları, uygun görüldüğü takdirde varlıklara ve değer nesnelerine sorumluluk atamayı savunur. Böylece varlıklar ve değer nesneleri, içinde ciddi bir iş mantığına sahip olacaklardır.

Şimdi bir hizmet bir varlık veya değer nesnesi üzerinde çalışırsa, varlık veya değer nesnesini alay etmeli ve sahte hizmeti hizmete geçirmeliyim (alaycılık, interfacekarşı karşıya olduğu düşünülen değer nesneleri veya varlıklar için bir gerektirecektir )?

Yoksa sadece newbir varlık / değer nesnesini kullanmalı ve hizmete somut bir uygulama geçirmeli ve böylece yalnızca bir birimi test etmek için birim test ilkesini ihlal etmeli miyim ?



Klasik ya da sahte bir test kullanıcısı olup olmadığınıza bağlıdır: martinfowler.com/articles/mocksArentStubs.html
jhewlett 23:13

@jhewlett Klasikçi hiçbir şeyle alay etmez; alaycı büyük olasılıkla yalnızca Hizmetler, Depolar ve Fabrikalar ("enjektabl" olan) ile alay etmez, asla Varlıklar veya Değer Nesneleri ("yenilebilir" olan) ile alay etmez.
Rogério

@ Rogério, Hizmetler dediğinizde; Uygulama Hizmetleri veya Etki Alanı Hizmetleri demek istiyor musunuz?
w0051977

@Songo, neye karar verdin? Alay ediyor musun: Varlıklar; Değer Nesneleri ve Etki Alanı Hizmetleri?
w0051977

Yanıtlar:


11

SOLID nesneleri gibi birim testlerinin de "kırılmanın bir nedeni" olması gerektiği fikrini okudum. Bu asil bir hedef, ancak bence birçok durumda bunun mümkün olmadığını göreceksiniz. Bu örneklerden biri, test edilen sistemin bağımlılığı olan "zengin" bir etki alanı nesneniz (DDD, her ikisi de "etki alanı modelini içeren Varlıklar ve Değer Nesneleri arasında ayrım yapar) olduğu yerdir.

Bu durumlarda, verilen felsefeye sahibim.etki alanı nesnesinin kendi kapsamlı birim sınama kapsamı vardır ve nesnenin farklı bir SUT için birim sınamada tasarlandığı gibi çalışacağına güvenerek birim sınamayı mutlaka ihlal etmez. Bu test, etki alanında bir değişiklik nedeniyle kırılacaksa, etki alanı nesnesinin birim testinin de kırılmasını ve beni araştırılacak bir şeye doğru yönlendirmesini beklerdim. Etki alanı nesnesinin birim sınaması kırmızı sınama olarak düzgün şekilde güncelleştirildiyse, değişiklikle yeşil hale getirildiyse ve bu diğer sınama başarısız olduysa, bu da kötü bir şey değildir; bu, diğer testin beklentilerinin alan için yeni beklentilerle çeliştiği anlamına geliyor ve her ikisinin de birbiriyle ve sistemin kapsayıcı kabul kriterleriyle aynı fikirde olduğundan emin olmam gerekiyor.

Bu nedenle, bir etki alanı nesnesini yalnızca, söz konusu etki alanı nesnesinin birim sınama perspektifinden istenmeyen (örneğin veri depoları gibi dış kaynaklara dokunma) "yan etkiler" üretmesi veya etki alanı nesnesinin mantığı yeterince karmaşık olsaydı alay ederdim. test için uygun duruma getirmek testi tanımlamak ve geçmek için bir engel haline gelir.

O zaman itici soru olur; hangisi daha kolay? Etki alanı nesnesini test içinde amaçlanan amaç için kullanmak veya alay etmek mi? İşlevsel bir değişikliğin hizmetin testini karmaşık bir şekilde bozması gibi, artık daha kolay bir seçenek olana kadar hangisini daha kolay yaparsanız yapın; bu olursa, hizmeti karmaşık bir şekilde bozmadan, hizmete bağlı işlevsel gereksinimleri ortaya çıkaran bir model oluşturmak için testi yeniden yazın.

Her iki durumda da, bu ikisi arasındaki etkileşimi daha yüksek bir soyutlama düzeyinde (örneğin, örneğin bir hizmetin arkasındaki işlevselliği değil) test eden gerçek hizmete takılı gerçek etki alanı nesnesini kullanan bir tümleştirme testi olmalıdır. ancak etki alanı nesnesinin serileştirildiği ve gönderildiği bir proxy).


DDD'de "etki alanı modeli", yalnızca Varlıklar ve Değer Nesneleri'ni değil Etki Alanı Hizmetleri, Depolar ve Fabrikaları da içerir.
Rogério

0

Bir şey değil işi var yaptığında düzgün çalıştığını bağımlı sınıf güvenmeniz, umut bu test edilmelidir ardından, bazı birim testleri orada başarısız olur çok vell. Belki bazı önemli birim testleri yoktur? Bir hata yaratacak, başlangıçtaki test sınıfımda üretilecek ve bağımlı sınıfın kendisinde yakalanmayacak denenmemiş bir durum olabilir.

Bu yüzden birim testler için bence, bağımlı sınıflar alay edilmeli. Bunu yapmazsanız, o zaman bu bütüncül bir testtir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.