Mô hình thường thấy trong các project hiện tại thì có 4 tầng như này:
1. MVC, MVVM tuỳ web hay desktop apps
2. Services
3. Data Access (ORM hoặc Repositories)
4. Database (stored procedures, triggers...)
Nếu viết unit tests kỹ thì 1 feature mới phải viết test cho cả 4 tầng này.
Tầng 1 là MVC, MVVM thì có thể viết UT cho controllers, viewmodels.. cái này ko có gì bàn cãi, cứ mock thằng services rồi viết thôi.
Các tầng 2, 3, 4 thì thật sự logic nặng nhất ở tầng 3 và 4. Services đa phần chỉ là gọi thằng 3 và 4 lên thôi. Hiếm lắm mới có cái services gọi nhiều repository hoặc gọi services khác với logic if else phức tạp. Trong khi đó cái tầng 3, 4 thì câu SQL query thường phức tạp hơn rất nhiều.
Giờ có 2 hướng chọn viết UT:
Cách 1. Viết unit test cho cả 4 tầng:
- controllers (mock services)
- services (mock data access)
- data access (mock database)
- database (viết test bằng SQL scripts để verify, stored procedure tests...)
Cách 2: Viết test cho 2 chổ:
- controllers (mock services)
- services (dek mock gì cả test thẳng từ services xuống database luôn). Các thím gọi nó là unit test hay integration test cũng được, ko quan tâm.
Tôi chọn cách 2 vì trong project thực tế, deadline dí liên tục thì có sh*t mà đủ time để viết test cho cả 4 tầng như cách 1. Hơn nữa cách 1 muốn đảm bảo test đúng thì phải test đủ cả 4 tầng, đặc biệt là tầng 3, 4 nếu bỏ 2 tầng này thì coi như viết UT vô dụng.
Nói chung cân nhắc effort bỏ ra và lợi ích thu lại thôi. Mời các thím vào chém.