簡體   English   中英

FakeItEasy - 在 F# 中調用選項成員 arguments

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM