[英]FakeItEasy - Invokes with option member arguments in F#
當試圖在偽造的 object 中為具有可選參數的方法提供偽造委托時
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>
並且代碼執行無誤。 Output 是:
Faked: Hello
This SO answer包含有關為可選 arguments 指定值的更多詳細信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.