2011-08-10 32 views
8

Tôi đang cố gắng xây dựng các bài kiểm tra đơn vị cho dự án Yii của mình.Mock MySQL DB cho PHPUnit

Sự cố: Cơ sở dữ liệu MySQL. Tôi không muốn phải chạy một cơ sở dữ liệu MySQL mỗi lần tôi chạy thử nghiệm vì nó chậm, không đáng tin cậy, có thể một số thành viên trong nhóm không có thiết lập, v.v.

Có vẻ như là một cách để làm một SQLite DB trong bộ nhớ và sử dụng nó, nhưng SQL được tạo ra bởi Yii dường như không hoạt động trên SQLite giống như trên MySQL. Tôi nhận được vô số lỗi.

Tóm lại: Tôi muốn giả lập cơ sở dữ liệu MySQL trong bộ nhớ.

Tôi làm cách nào để thực hiện việc này?

Trả lời

5

Đóng gói các hoạt động MySQL của bạn trong Data Access Object. Bạn không chỉ ẩn SQL từ logic nghiệp vụ của mình có lợi ích khác, bạn có thể sử dụng mock DAO khi kiểm tra phần còn lại của ứng dụng. Mocks sẽ không yêu cầu cơ sở dữ liệu và cho phép bạn xác thực rằng logic nghiệp vụ đang thực hiện các cuộc gọi chính xác đến lớp dữ liệu.

Điều này tương tự như câu trả lời của Mchl nhưng di chuyển chế độ nháp lên một lớp. Tôi thấy dễ dàng hơn khi giả lập findUserByEmail() thay vì các phương thức mysqli khác nhau. Bạn có thể để lại xác minh SQL cho các bài kiểm tra DAO và chạy với cơ sở dữ liệu trong các bài kiểm tra tích hợp của bạn.

1

Một cách để làm là giả lập đối tượng kết nối của bạn và kiểm tra xem phương thức query() có được gọi với SQL dự kiến ​​hay không. Bạn cần một cách khác để xác thực rằng SQL bạn đang mong đợi là chính xác. Điều này có thể được thực hiện dưới dạng một nhóm thử nghiệm riêng biệt (hoặc thậm chí chuyển ra ngoài bộ kiểm thử của bạn) để nó không chạy với tất cả các thử nghiệm khác.

Các vấn đề liên quan