DDD đề xuất rằng các đối tượng miền phải ở trạng thái hợp lệ bất kỳ lúc nào. Các rễ tổng hợp chịu trách nhiệm đảm bảo các bất biến và các nhà máy để lắp ráp các đối tượng với tất cả các bộ phận cần thiết để chúng được khởi tạo ở trạng thái hợp lệ.Làm thế nào để giữ cho các bài kiểm tra đơn vị của bạn đơn giản và cô lập mà vẫn đảm bảo các bất biến DDD?
Tuy nhiên điều này dường như làm phức tạp nhiệm vụ tạo đơn vị, kiểm tra đơn vị bị cô lập rất nhiều.
Giả sử chúng tôi có BookRepository chứa Sách. Một cuốn sách có:
- một Tác giả
- một loại
- một danh sách các tiệm sách, bạn có thể tìm thấy những cuốn sách trong
Những thuộc tính được yêu cầu: một cuốn sách phải có một tác giả, một danh mục và ít nhất một cửa hàng sách bạn có thể mua sách từ đó. Có khả năng là một BookFactory vì nó là một đối tượng khá phức tạp và Nhà máy sẽ khởi tạo Sách với ít nhất tất cả các thuộc tính được đề cập. Có lẽ chúng ta cũng sẽ làm cho hàm tạo Book riêng tư (và Factory được lồng nhau) để không ai có thể tạo ra một Book rỗng trừ Factory.
Bây giờ, chúng tôi muốn đơn vị kiểm tra một phương pháp của BookRepository trả về tất cả các Sách. Để kiểm tra nếu phương thức trả về các sách, chúng ta phải thiết lập một ngữ cảnh thử nghiệm (bước Sắp xếp theo các điều khoản AAA) trong đó một số Sách đã có trong Kho lưu trữ.
Trong C#:
[Test]
public void GetAllBooks_Returns_All_Books()
{
//Lengthy and messy Arrange section
BookRepository bookRepository = new BookRepository();
Author evans = new Author("Evans", "Eric");
BookCategory category = new BookCategory("Software Development");
Address address = new Address("55 Plumtree Road");
BookStore bookStore = BookStoreFactory.Create("The Plum Bookshop", address);
IList<BookStore> bookstores = new List<BookStore>() { bookStore };
Book domainDrivenDesign = BookFactory.Create("Domain Driven Design", evans, category, bookstores);
Book otherBook = BookFactory.Create("other book", evans, category, bookstores);
bookRepository.Add(domainDrivenDesign);
bookRepository.Add(otherBook);
IList<Book> returnedBooks = bookRepository.GetAllBooks();
Assert.AreEqual(2, returnedBooks.Count);
Assert.Contains(domainDrivenDesign, returnedBooks);
Assert.Contains(otherBook, returnedBooks);
}
Cho rằng công cụ duy nhất mà chúng ta có để tạo ra Book đối tượng là các nhà máy, các đơn vị kiểm tra bây giờ sử dụng và phụ thuộc vào các nhà máy và inderectly trên Danh mục, tác giả và cửa hàng kể từ chúng ta cần những đối tượng đó để xây dựng một cuốn sách và sau đó đặt nó vào bối cảnh thử nghiệm.
Bạn có cho rằng đây là phụ thuộc giống như cách kiểm tra đơn vị dịch vụ mà chúng tôi sẽ phụ thuộc vào, một Kho lưu trữ mà Dịch vụ sẽ gọi?
Làm cách nào bạn giải quyết được vấn đề phải tạo lại toàn bộ cụm đối tượng để có thể thử nghiệm một điều đơn giản? Làm thế nào bạn sẽ phá vỡ sự phụ thuộc đó và loại bỏ tất cả các thuộc tính Sách mà chúng ta không cần trong thử nghiệm của chúng ta? Bằng cách sử dụng mocks hoặc khai?
Nếu bạn giả lập điều một Repository chứa, những loại giả/cuống bạn sẽ sử dụng như trái ngược với khi bạn thử lên một cái gì đó đối tượng được kiểm tra cuộc đàm phán để hoặc tiêu thụ?