FakeItEasy - 在 F# 中使用选项成员参数调用

FakeItEasy - Invokes with option member arguments in F#

尝试为伪造对象中带有可选参数的方法提供伪造委托时

type MyType () = 
    abstract B: ?s:string -> unit
    default x.B (?s: string) = Option.iter (printfn "Implemented: %s") s

[<Property>]
let doit () = 
    let a = A.Fake<MyType>()
    A.CallTo(fun () -> a.B(ignored())).Invokes(fun s -> Option.iter (printfn "Faked: %s") s)
    a.B "Hello"

FakeItEasy 投诉

FakeItEasy.Configuration.FakeConfigurationException: 参数约束的类型为 System.String,但参数的类型为 Microsoft.FSharp.Core.FSharpOption`1[System.String]。没有调用可以匹配此约束。

有没有办法在不改变类型定义的情况下实现这个运行?

好的,我可以通过将 ignored 定义为:

来重现您的错误消息
let ignored<'t> () = A<'t>.Ignored

问题是您为实际上是字符串选项的参数定义了字符串约束。您可以通过在调用成员时显式命名参数 ?s 来解决此问题,如下所示:

A.CallTo(fun () -> a.B(?s=ignored())).Invokes(fun s -> Option.iter (printfn "Faked: %s") s)

现在约束具有正确的类型,Option<string>,并且代码执行无误。输出为:

Faked: Hello

This SO answer 有更多关于为可选参数指定值的详细信息。