Controller
Trước khi code, bạn hãy đặt câu hỏi: Mục đích của controller này là gì ? Đi vào chi tiết hơn:
- Intention của nó: mang lại điều gì cho người sử dụng nó.
- Input của nó: chính là các params bạn truyền vào.
- Output của nó: chính là cách bạn trả về http response: http code bao nhiêu, body chứa nội dung gì, cookie thay đổi không,…
- Side-Effect của nó: Nó có chạm tới các component khác trong hệ thống không ? Ví dụ có lưu dữ liệu vào database không, có truyền 1 event qua redis hay không, có cập nhật lại cache hay không ,…
Sau khi đã phân tích bước trên, bạn bắt đầu viết controller test cho cái controller của bạn.
Câu hỏi tiếp theo là, bạn test cái gì ?
- Happy path : bạn truyền vào params chuẩn để kiểm tra toàn bộ mọi thứ xảy ra như ý bạn muốn (thoả mãn được cái intention ban đầu)
- Sad path : Bạn truyền các params cho các trường hợp mà bạn biết sẽ xảy ra lỗi.
Tiếp theo, bạn viết gì trong controller ?
- Authenticate user: Bước này thường đặt ở ApplicationController dưới dạng before_action để kiểm tra người đang đăng nhập hệ thống là ai (current_user )
- Authorize user : Bước này để xác nhận quyền thực thi action controller của current_user.
- Pre-processing params : Đây là bước bạn nhào nặn bộ params trước khi đưa vào các bước xử lý tiếp theo. Bước này có thể là optional trong trường hợp params không quá phức tạp.
- Validate params: Kiểm tra cấu trúc params có đúng format bạn mong muốn hay không.
- Xử lý logic dựa vào params: Đây là những thay đổi hệ thống sẽ xảy ra
- Trả về response theo happy path (200 http status code)
Model:
Các vai trò của 1 Model là:
- Mô tả 1 đối tượng trong bài toán cụ thể.
- Nếu nó map trực tiếp với 1 database table , kế thừa nó bởi ActiveRecord::Base .
- Mô tả mối quan hệ với các đối tượng khác. Nếu nó kế thừa bởi ActiveRecord::Base, bạn có thể sử dụng các phương thức has_many, belongs_to để tiện lợi trong việc sử dụng các lệnh tương tác với database .
- Validate params : Một model có thể kiểm tra các input params khi thay đổi trạng thái của nó.
Lưu ý :
- Các model thường được gọi ở tầng Controller để thay đổi trạng thái của nó.
- Không nên thay đổi trạng thái của Model khác từ 1 model khác.
- Để reuse logic, bạn có thể tạo các Service Object nhỏ. Tưởng tượng bạn có thể dùng 1 object CreateUser trong active_admin, rails console, rails controller ,… Nếu cần phải reuse, hãy reuse nó.