2011-08-19 21 views
6

通常、OCamlでデータベース接続を偽るテストdoubleを使用するのはどうですか?OCamlでテストを二重にする

データベースの上に小さなAPIをテストして、このAPIが公開する各機能にConnectionタイプを提供することで、これが機能する方法を説明します。以下のような

何か:

let get_data connection = do_something_with_connection 

はどのようにこれはユニットテストだろうか?

OCamlのパワフルなタイプのシステムは、あなたが奇妙な間違いをしていないことをすでに確認しているので、この種のテストは通常​​OCamlで行われます。

答えて

3

Connectionと同じメソッド名を持つオブジェクトを、それぞれ同じシグネチャ(スタブ機能を使用すると明らかに)で作成します。次に、これらのオブジェクトの1つをインスタンス化し、それをサブタイプ化を介してConnectionとして宣言することができます。そして、それを関数のいずれかに渡すことができます。

Hereは、サブタイピングに関する有用な情報です(Ocamlの継承と同じではありません)。

1

ファンクタを使用してモジュールをビルドします。ファンクタを引数としてConnectionモジュールを使用します。次に、テストでConnectionモジュールをスタブアウトすることができます。

だから、例えば、あなたのdb.mlファイルは一種の次のようになります。

(* 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 

は、その後、あなたのtest_db.mlであなただけの接続モジュールに

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"]) 
をスタブアウトすることができます
関連する問題