2

QuickCheck を使用してテストしたい Happstack.State MACID メソッドのセットがありますが、それを達成するための最もエレガントな方法を見つけるのに苦労しています。私が直面している問題は次のとおりです。

  • Evモナド計算を評価する唯一の方法は、またはIOを介し​​てモナド内で行うことです。queryupdate
  • 純粋にインメモリ MACID ストアを作成する方法はありません。これは設計によるものです。したがって、IOモナドで実行するということは、各テスト後にクリーンアップする一時ファイルがあることを意味します。
  • initialValue状態を除いて、新しい MACID ストアを初期化する方法はありません。Arbitraryステート ホールセールを置き換えるアクセス メソッドを公開しない限り、生成することはできません。
  • 上記のすべてに対処するということは、MonadReaderor ( の機能のみを使用するメソッドを記述し、 orの代わりにMonadStateテストを実行することを意味します。これは、メソッド定義内でorなどを使用しないことを意味します。ReaderStateEvgetRandomgetEventClockTime

私が見ることができる唯一のオプションは次のとおりです。

  • 使い捨てのディスク上の MACID ストアでメソッドを実行し、各テスト後にクリーンアップし、毎回開始するように調整しinitialValueます。
  • ほとんどのコードがMonadReaderorで実行されるようにメソッドを記述し (テストがより簡単です)、必要に応じてorMonadStateを呼び出す、その周りの少量の QuickCheck 不可の接着剤に依存します。getRandomgetEventClockTime

私が見落としているより良い解決策はありますか?

4

2 に答える 2

1

happstack-state に含まれている quickcheck プロパティをチェックアウトできます。

http://patch-tag.com/r/mae/happstack/snapshot/current/content/pretty/happstack-state/tests/Happstack/State/Tests

テストを行っているだけで、使い捨てのデータ ストアが必要な場合は、状態、イベント ファイル、およびチェックポイントを RAM に保存するだけのメモリ セーバーを使用できます。力を失うと、すべての状態が失われます。これはテストでは問題ありませんが、実際のライブ サーバーでは問題ありません。リンク先のメッセージは、テストだけでなく、実際のライブ サーバーについての話でした。

これは initialValue の問題には役立ちませんが、ディスクのクリーンアップを行う必要がないため、オプション 1 が簡単になります。

initialValue を置き換えるには、現在の状態のホールセールを置き換える独自のメソッドを作成する必要があります。

何かのようなもの:

newState :: YourState -> YourState の更新 ()
newState st = put st

か何か。

  • ジェレミー
于 2010-06-05T23:37:56.427 に答える
0

関数を MonadState (またはクエリの場合は MonadReader) に対してポリモーフィックとして記述すると、runState/runReader を使用してテスト ハーネスをセットアップするのがはるかに簡単になります。

私が覚えている限りでは、happstack の TH コード ジェネレーターは、そのような署名には問題ありません。

于 2010-06-06T16:42:19.523 に答える