Tôi thực sự vật lộn để viết các bài kiểm tra đơn vị hiệu quả cho một dự án Django lớn. Tôi có phạm vi kiểm tra khá tốt, nhưng tôi nhận ra rằng các bài kiểm tra tôi đã viết chắc chắn là bài kiểm tra tích hợp / chấp nhận, hoàn toàn không phải bài kiểm tra đơn vị và tôi có những phần quan trọng trong ứng dụng của mình không được kiểm tra hiệu quả. Tôi muốn sửa cái này càng sớm càng tốt.
Đây là vấn đề của tôi. Lược đồ của tôi có mối quan hệ sâu sắc và được định hướng theo thời gian, mang lại cho đối tượng mô hình của tôi khả năng ghép nội bộ cao và nhiều trạng thái. Nhiều phương thức mô hình của tôi truy vấn dựa trên các khoảng thời gian và tôi đã có nhiều auto_now_add
tiến triển trong các trường được đánh dấu thời gian. Vì vậy, lấy một phương thức trông như thế này chẳng hạn:
def summary(self, startTime=None, endTime=None):
# ... logic to assign a proper start and end time
# if none was provided, probably using datetime.now()
objects = self.related_model_set.manager_method.filter(...)
return sum(object.key_method(startTime, endTime) for object in objects)
Làm thế nào để một cách tiếp cận kiểm tra một cái gì đó như thế này?
Đây là nơi tôi đang ở cho đến nay. Nó xảy ra với tôi rằng mục tiêu thử nghiệm đơn vị nên được đưa ra một số hành vi bị chế giễu by key_method
trên các đối số của nó, là summary
lọc / tổng hợp chính xác để tạo ra một kết quả chính xác?
Mocking datetime.now () là đủ đơn giản, nhưng làm thế nào tôi có thể giả định phần còn lại của hành vi?
- Tôi có thể sử dụng đồ đạc, nhưng tôi đã nghe thấy những ưu và nhược điểm của việc sử dụng đồ đạc để xây dựng dữ liệu của mình (khả năng bảo trì kém là một kẻ lừa đảo đối với tôi).
- Tôi cũng có thể thiết lập dữ liệu của mình thông qua ORM, nhưng điều đó có thể hạn chế, vì sau đó tôi cũng phải tạo các đối tượng liên quan. Và ORM không cho phép bạn lộn xộn với
auto_now_add
các trường theo cách thủ công. - Mocking ORM là một tùy chọn khác, nhưng không chỉ khó để giả lập các phương thức ORM lồng nhau sâu sắc, mà logic trong mã ORM bị loại ra khỏi thử nghiệm, và việc nhạo báng dường như làm cho thử nghiệm thực sự phụ thuộc vào bên trong và phụ thuộc của chức năng dưới kiểm tra.
Các loại hạt cứng nhất để bẻ khóa dường như là các chức năng như thế này, nằm trên một vài lớp mô hình và các hàm cấp thấp hơn và phụ thuộc rất nhiều vào thời gian, mặc dù các chức năng này có thể không quá phức tạp. Vấn đề chung của tôi là cho dù tôi có thể cắt nó như thế nào, các bài kiểm tra của tôi trông phức tạp hơn các chức năng mà chúng đang kiểm tra.