我试图将 Rhino Mocks 与 F# 代码一起使用,但以下代码存在问题:
let service = MockRepository.GenerateMock<IMyService>()
service.Stub(s => s.Name).Return("Service");
这并不奇怪,因为 Stub 不是 IMyService 接口(interface)的一部分,它是 Rhino Mocks 定义的 C# 扩展方法。
稍微修改的代码有效:
let service = MockRepository.GenerateMock<IMyService>()
RhinoMocksExtensions.Stub<IMyService, string>(service, fun s -> s.Name).Return("Service");
但是,在 F# 中定义一个扩展方法会很好,但是它将是一个参数化的通用扩展方法,它需要一个 tuple 。我正在尝试各种语法,但没有任何运气。我没有找到 F# 当前是否支持此功能的信息。如果有人知道,请告诉我。
最佳答案
正如 kvb 所提到的,这在 F# 2.0 中是不可能的。在这种特殊情况下,我将包装 Rhino.Mocks 流利的接口(interface)以使其在 F# 中更加惯用,例如:
let mstub f target =
RhinoMocksExtensions.Stub(target, Function(f))
let mreturn value (options: IMethodOptions<'a>) =
options.Return value
let service = MockRepository.GenerateMock<IComparer>()
service |> mstub (fun s -> s.Compare(1,2)) |> mreturn 1 |> ignore
What's fluent in one language is not necessarily fluent in another. (对不起插件,但我真的认为它在这里相关)
关于f# - 是否可以在 F# 中定义通用扩展方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3381570/