--- name: GenerateArchitectureTest description: Hướng dẫn tạo Architecture Test sử dụng NetArchTest.Rules để bảo vệ kiến trúc Clean Architecture. --- # GenerateArchitectureTest Skill Khi user yêu cầu kiểm tra hoặc khởi tạo **Architecture Test**, bạn cần sử dụng thư viện `NetArchTest.Rules` để sinh luận kiểm điểm nhằm bảo vệ chặt chẽ cấu trúc "Clean Architecture" của dự án. ## Mục đích - Ngăn chặn Dev code ẩu, import sai library/module giữa các tầng (layer). - Nếu vi phạm (VD: import Entity Framework vào tầng Domain), bài test này sẽ báo ĐỎ ngay lập tức lúc build code. Bằng chứng thép giúp kiến trúc được bảo vệ tuyệt đối! ## Hướng dẫn viết Test Rules Bạn cần viết các test method (dùng `[Fact]` với xUnit hoặc NUnit) sử dụng Fluent API của `NetArchTest.Rules`. Dưới đây là các luật phổ biến bắt buộc: 1. **Domain Layer Rules (Luật tầng Domain):** - Domain không được phụ thuộc vào bất cứ thứ gì từ Infrastructure, Application hay WebAPI. ```csharp [Fact] public void DomainLayer_ShouldNot_HaveDependencyOn_OtherLayers() { var result = Types.InAssembly(DomainAssembly) .ShouldNot() .HaveDependencyOnAny( "MyNewProjectName.Application", "MyNewProjectName.Infrastructure", "MyNewProjectName.WebAPI" ) .GetResult(); Assert.True(result.IsSuccessful); } ``` 2. **Application Layer Rules (Luật tầng Application):** - Application Layer chỉ được phép giao tiếp với Domain, KHÔNG ĐƯỢC có dependency vào `Infrastructure` hoặc `WebAPI`. 3. **Controller Rules (Luật đặt tên/vị trí API):** - Controller bắt buộc phải kế thừa class BaseAPIController, và có hậu tố là "Controller". - Không được phép truy vấn Database trực tiếp từ Controller (ngăn không cho Inject `DbContext` hay `IRepository` vào Controller, kiểm duyệt dependencies của Constructor). 4. **Handler Rules (CQRS):** - Các Handler xử lý logic phải implements interface `IRequestHandler` và kết thúc bằng `CommandHandler` hoặc `QueryHandler`. Nó chỉ nằm ở Application Layer. ## Định dạng file đầu ra - **Đường dẫn:** Chứa trong test project như `tests/MyNewProjectName.ArchitectureTests/`. - **Tên file:** Thường đặt tên theo phạm vi test như `LayerTests.cs`, `DesignConventionTests.cs`, `NamingRulesTests.cs`, v.v.