2011-08-19 43 views
6

Làm thế nào thông thường là có một thử nghiệm tăng gấp đôi trong OCaml giả mạo một kết nối cơ sở dữ liệu?Thực hiện kiểm tra đôi trong OCaml

Cho phép nói rằng bạn muốn thử nghiệm một API nhỏ trên cơ sở dữ liệu và cách hoạt động này bằng cách cung cấp loại Connection cho từng chức năng mà API hiển thị.

Cái gì như:

let get_data connection = do_something_with_connection 

Làm thế nào điều này sẽ là đơn vị thử nghiệm?

Trên một lưu ý lớn hơn là loại thử nghiệm này thông thường trong OCaml, với thực tế là hệ thống kiểu mạnh mẽ của OCaml đã đảm bảo rằng bạn không mắc phải những sai lầm kỳ lạ?

Trả lời

3

Bạn sẽ tạo một đối tượng có tất cả các tên phương thức giống như kết nối với cùng một chữ ký (và với chức năng sơ khai, rõ ràng). Sau đó, bạn có thể khởi tạo một trong các đối tượng này và khai báo nó như là một kết nối thông qua phân nhóm. Sau đó, nó có thể được chuyển vào bất kỳ chức năng nào.

Here là một bit hữu ích về phân loại phụ (trong đó, cần lưu ý, không phải là những thứ giống như kế thừa trong Ocaml).

1

Xây dựng mô-đun của bạn bằng một hàm, trong đó lấy mô-đun Kết nối làm đối số của nó. Sau đó, bạn có thể phân tích mô-đun Kết nối trong các thử nghiệm của mình.

Vì vậy, ví dụ, tập tin db.ml của bạn có thể tìm kiếm loại như thế này:

(* The interface of Connection that we use *)                          
module type CONNECTION = sig 
    type t 
    val execute : string -> t -> string list 
end 

(* functor to build Db modules, given a Connection module *) 
module Make(Connection : CONNECTION) = struct 
    ... 
    let get_data connection = 
    do_something_with (Connection.execute "some query" connection) 
    ... 
end 

Sau đó, trong test_db.ml của bạn, bạn chỉ có thể còn sơ khai ra các mô-đun kết nối

let test_get_data() = 
    let module TestConnection = struct 
    type t = unit 
    let execute _ _ = ["data"] 
    end in 
    let module TestDb = Db.Make(TestConnection) in 

    assert (TestDb.get_data() = ["munged data"]) 
Các vấn đề liên quan