7

ネットワークを介してリクエストを行うHaskellアプリケーションをテストするためにどのような方法が使用されているのか疑問に思っていますか?Rubyの土地から来て、Haskell関数をテストする目的で、ネットワーク呼び出しをスタブまたは「シミュレート」できるものを探していました。私は特に「VCR」のようなソリューション(例:https ://github.com/myronmarston/vcr )に興味があります。これは、最も実行可能なオプションであるIMHOのようです。

したがって、ネットワークの要求と応答のペアを一度記録してから、これらの記録を後続のテストで再利用できるようにしたいと思います。テストの前にWebサーバー(ワープ)を起動し、事前に記録された応答を提供する独自の単純な組み合わせを考え出しましたが、アプリケーション内のすべてのURLを「localhost」にポイントする必要があります。これは、アプリケーション内のすべてのURLを置き換えることが常に可能であるとは限らないと思います。上記の独自のセットアップには非常に満足していますが(後で専用のテストツール/フレームワークの「プラグイン」を作成したいのですが)、車輪の再発明はしたくありません。

4

1 に答える 1

3

Control.Proxy.Tutorialを確認してください。タイプの周りにプロキシラッパーを記述できる場合は、テストインターフェイスと実際のインターフェイスを次のように簡単に交換できます。

client <-< simulatedServer

client <-< realServer

編集:コメントで質問に答えるには、aを使用してリクエストServerのラッパーを記述します。simpleHTTP

realServer
 :: HStream ty => Request ty -> Server (Request ty) (Result (Response ty)) IO r
realServer = foreverK $ \req -> do
    result <- lift $ simpleHTTP req
    respond result

シミュレートされたサーバーは次のようになります。

simulatedServer
 :: (Monad m, HStream ty)
 => Request ty -> Server (Request ty) (Result (Response ty)) m r
simulatedServer = foreverK $ \req -> do
    result <- lift $ simulatedRequest req
    respond result

そして、クライアントは次のようになります。

client
 :: (Monad m, HStream ty) => () -> Client (Request ty) (Result (Response ty)) m r
client () = forever $ do
    let req = <something>
    result <- request req
    lift $ doSomethingWith result

次に、以下を使用して実サーバーと偽サーバーをテストできます。

-- Test the real server
main = runSession $ client <-< realServer

-- Test the fake server
main = runSession $ client <-< simulatedServer

およびは、テストにどのベースモナドを使用するかわからないため、ベースモナドでは多形ですclientsimulatedServer唯一の要件は、作成する2つのものが同じベースモナドを持っていること、または少なくとも1つがベースモナドで多型であることです。

于 2012-09-14T15:46:57.653 に答える