2013-12-18 3 views
5

私たちはモジュール間で多くのハード結合依存関係を持つかなりのocamlコードを持っています。最近、我々はこれらのモジュールを分離するためにファンクタのアプローチに移動してきたので、私たちは、モジュールBとCに依存し、モジュールAを持っている場合、我々は宣言の中で次のように行く:私たちが噴射することができる。このようOCamlモックモジュールの生成

module A: (B:B_Signature) (C:C_Signature) = struct ... end 

ユニットテストのためにモジュールAでこれらのシグニチャに応答する「モックアップされた」BまたはCモジュールを含み、実際のBおよびCモジュールを含むプロダクションモジュールをその中に作成することができます。問題は、今では、これらのモックアップされたモジュールを手作業で出す必要があることです。これは、通常、定型文のロードであるため、ブロッカーのビットです。

私はocamlモジュールから '模擬'モジュールを手で入力するのではなく、生成する方法を探しています。私は次のシグネチャ私はこの

module A_mock = 
struct 
let f _s _i = 
    "" 
let g _s1 _s2 = 
    0 
end 

のように、たとえば、モック実装を生成したい

module type A = 
    sig 
    val f: string -> int -> string 
    val g: string -> string -> int 
    end 

を持つ、いくつかの機能を持つモジュールを持っている場合、私はそれを意味することは、これは、ありますは同じシグニチャを持つが、引数を無視してデフォルトで返るfとgの実装と関数fの空文字と関数gの0を持つモジュールです。

これらのデフォルト値、空の文字列とゼロは単なる例です。私はこれを最後にもっと設定したいと思うことを知っている、私はモックを作成し、特定の関数の戻り値を指定したいかもしれない、おそらく嘲笑関数が呼び出された引数を調べることができるなど今のところ、この単純なケースでは、私は手で入力して実装する以外の解決策を探しています。

OCamlでこれを行うフレームワークが見つかりませんでした。

私はcamlp4とコード生成によってどのようになっているのかを調べようとしていましたが、ドキュメントが限られているように見えました。

誰かがフレームワークを知っているのですか、OCamlのシグネチャからこの種の定型化モジュールを作成するコード生成の方法があるのでしょうか?

+0

Kapput(http://kaputt.x9c.fr/)は 'Mock'モジュールを有しています。しかし、私はそれがあなたが望むものだとは思わない。あなたがスパイのようにしたいのではないですか?その場合、私は 'ppx'や' camlp4'は学習曲線が急峻ではあるが、その必要性を解決すべきだと思う。 – nlucaroni

+0

ええ、確かに、この単純なケースではスパイの方が多いですね。しかし最終的には、Javaの対応、可能性(関数をどのような引数で返す必要があるか、など)を引用するために、より多くの "Mockitoスタイル"が必要です。しかし実際には、camlp4のドキュメントは本当にうまくいかない(または私はまだ良い文書を見つけられませんでした)ので、誰かがこの単純なスパイモジュールに関する正確な経路を設定することができれば、それは素晴らしいでしょう。 – Kasper

+0

最近私は仕事をMockitoを使う場所に切り替えました。だから私はMockとSpyのコンセプト全体に精通していますので、私が何を話しているかを再確認することは良いことです。私は実際にこの数週間、この特定の問題について多くのことを考えていました。私はcamlp4の下で時間の無駄かもしれないし、水平線でppxで座っていました。 – nlucaroni

答えて

0

オーケー

カスパーは、私はモックモジュールを作成しますcamp4ライブラリーの開始を作成しました。 githubにはwikiページがあり、説明のシグネチャファイルの例とmasterブランチで2つのスクリプトがチェックインされています。これを拡張してより堅牢なものにしたいと考えています。使用を開始すると、もっと多くのアイデアが出てくるでしょう。

https://github.com/KasperJanssens/mockaml