多くのホーム プロジェクトで徐々に F# に切り替えていますが、完全なアプリケーションをどのように接続するか、特に分野横断的な懸念事項について少し困惑しています。
C# で何かをログに記録したい場合は、依存性注入を使用して ILogger を各クラスに渡し、これをコードから簡単に呼び出すことができます。モックを渡して検証することで、特定の状況でログが書き込まれることをテストで検証できます。
public class MyClass
{
readonly ILogger _logger;
public MyClass(ILogger logger)
{
_logger = logger;
}
public int Divide(int x, int y)
{
if(y == 0)
{
_logger.Warn("y was 0");
return 0;
}
return x / y;
}
}
F# では、モジュールをより多く使用しているため、上記は次のようになります。
module Stuff
let divde x y =
match y with
| 0 -> 0
| _ -> x / y
Logging というモジュールがあれば、それを開いて、y が 0 の場合にそこからログ関数を使用することができますが、単体テストのためにこれをどのように注入すればよいでしょうか?
各関数にログ関数 (文字列 -> 単位) を使用させ、部分的なアプリケーションを使用してそれらを接続することもできますが、実際の呼び出しをログ呼び出し内にラップする新しい関数を作成する場合と同様に、非常に多くの作業のように思えます。それを行うことができる特定のパターンまたは私が見逃している F# のビットはありますか? (私は kprintf 関数を見てきましたが、完全なアプリケーションの具体的な実装を使用しながら、さまざまなテスト シナリオで関数を指定する方法をまだ知りません)
同様に、データを取得したリポジトリをどのようにスタブ化しますか? いくつかのクラスをインスタンス化し、それに CRUD 関数を設定する必要がありますか、または (#define を除いて) 開いているモジュールを挿入する方法はありますか?