对于我的许多家庭项目,我正在逐渐切换到 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 的情况下从那里使用一个 log 函数,但是我如何将它注入到单元测试中呢?
我可以让每个函数获取一个日志函数(字符串 -> 单元),然后使用部分应用程序将它们连接起来,但这似乎是一项非常艰巨的工作,就像创建一个将实际调用包装在日志调用中的新函数一样。是否有我缺少的特定模式或一点 F# 可以做到这一点?(我见过 kprintf 函数,但我仍然不知道如何为各种测试场景指定函数,同时为完整的应用程序使用具体实现)
同样,您将如何存根提取数据的存储库?您是否需要实例化一些类并在其上设置 CRUD 函数,或者是否有办法注入您打开的模块(#define 除外)