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 有更多关于为可选参数指定值的详细信息。
尝试为伪造对象中带有可选参数的方法提供伪造委托时
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 有更多关于为可选参数指定值的详细信息。