Câu hỏiTrong TDD và DDD, làm thế nào để bạn xử lý các thuộc tính chỉ đọc trong hàng giả?
Làm cách nào để bạn xử lý trường chỉ đọc khi tạo hàng giả?
nền
Tôi đang ở giai đoạn bắt đầu của việc sử dụng ASP.Net MVC và tôi sử dụng thể thao hàng Steven Sanderson và Dinner Nerd Scott Gu làm ví dụ. Một vấn đề nhỏ mà tôi vừa mới đánh là cách làm việc với các thuộc tính chỉ đọc khi thực hiện các lệnh giả mạo. Tôi đang sử dụng LINQToSQL.
giao diện của tôi là:
public interface IPersonRespository
{
Person GetPerson(int id);
}
và giả của tôi trở nên
public class FakePersonRepository
{
public Person GetPerson(int id)
{
return new Person {id="EMP12345", name="John Doe", age=47, ssn=123-45-6789, totalDrWhoEpisodesWatched=42};
}
}
Dưới đây là vấn đề của tôi. Các trường id, ssn và totalDrWhoEpisodesWatched là chỉ đọc, vì vậy mã trên sẽ không thực sự hoạt động. Tuy nhiên, tôi không nhận ra cách tạo một người mới giả và thiết lập thuộc tính chỉ đọc. Tôi chắc chắn có một giải pháp, nhưng tôi chưa từng tìm thấy nó trong các tìm kiếm của tôi.
Cập nhật: Thừa kế + Thuộc tính ẩn chứa làm giải pháp tiềm năng?
Tôi chưa quyết định giải pháp vững chắc cho vấn đề. Tôi không thích khái niệm sửa đổi các lớp Domain của tôi với mục đích tạo ra hàng giả. Đối với tôi, việc thêm đánh dấu vào các lớp miền để thực hiện kiểm thử là một dạng ghép nối bổ sung để thực hiện kiểm thử của bạn. Bây giờ tôi đang điều tra một khả năng khác, đó là tạo ra một lớp FakePerson, mà kế thừa từ Person, nhưng ẩn các thuộc tính với các thuộc tính read-write mới.
public class FakePerson: Person
{
public new int age { get; set; }
public new string ssn { get; set; }
public new int totalDrWhoEpisodesWatched { get; set; }
}
Cho đến nay, giải pháp này là cách tôi nghiêng. Nó phá vỡ Nguyên tắc thay thế Liskov, tuy nhiên điều đó không làm tôi khó chịu nhiều trong một dự án thử nghiệm. Tôi rất vui khi nghe bất kỳ lời chỉ trích và/hoặc phản hồi nào về vấn đề này như một giải pháp.
Winner: Mock Khung
Moq dường như thực hiện công việc. Giải pháp cuối cùng của tôi về việc ẩn thuộc tính thông qua thừa kế, trên thực tế, công việc, tuy nhiên bằng cách sử dụng Moq, tôi nhận được một tập hợp các chức năng tiêu chuẩn được duy trì nhiều hơn. Tôi giả định rằng các khuôn khổ giả khác có chức năng này, nhưng tôi chưa kiểm tra. Moq được cho là đơn giản hơn cho việc bắt đầu viết mock, mà tôi chắc chắn là ngay bây giờ.
Tại sao nó thiết lập để được readonly? –
Nó được đặt thành chỉ đọc vì không có người dùng nào của miền có quyền sửa đổi thuộc tính. Có thể vì một số lý do, nhưng thường là do ứng dụng không có quyền sửa đổi trường vì đó là trường tính toán/được tạo tự động hoặc do chính sách bảo mật của cơ sở dữ liệu. – John
Về chủ đề không liên quan chút nào, tôi khuyên bạn nên đổi tên thuộc tính thành PascalCase để tuân thủ các quy ước đặt tên .NET. http://msdn.microsoft.com/en-us/library/ms229043(loband).aspx –