3

私はこのようなインターフェースを持っています

type IAppDatabase = 
    abstract Get<'T> : seq<Guid> -> Task<seq<'T>>
    abstract Set<'T> : seq<'T> -> Task<bool>
    abstract GetIds<'T> : unit -> Task<seq<Guid>>

私はこのように嘲笑しようとします

let results = seq [DT.Result (); DT.Result (); DT.Result ()]
let resultInfos = DT.Results results
let guids = seq [Guid.NewGuid(); Guid.NewGuid(); Guid.NewGuid()]

let taskGetIds = Task.Factory.StartNew<seq<Guid>>(fun () -> guids)
let taskSet = Task.Factory.StartNew<bool>(fun () -> true )
let taskGet = Task.Factory.StartNew<seq<DT.Result>>(fun () -> results)

let db = Mock<IAppDatabase>.With(fun x -> 
            <@  
               x.GetIds () --> taskGetIds
               x.Get guids --> taskGet
               x.Set results --> taskSet @>)

こんな試験があります

let [<Test>] ``Set the resultInfos in de app database`` () =
    let app = App (db) :> IApp
    let res = app.Create resultInfos |> Async.RunSynchronously 
    verify <@db.Set results @> once
    res |> should be True

このapp.Create関数は、db.Setを使用して を呼び出しますAsync.AwaitTask

これはすべてうまく機能し、Foq は素晴らしいです。ただし、検証によって system.exception が発生します。methodsMatchFoqの関数expectedMethodはfalseParameterInfo.ParameterTypeを返しSystem.Collections.Generic.IEnumerable``1[Result]ます。actual.MethodParameterInfo.ParameterTypeSystem.Collections.Generic.IEnumerable``1[T]

型パラメーターの追加と削除を試みましたが、役に立ちませんでした。インターフェイスに型パラメーター (およびタスク) が必要です。これは、C# で他の人によって実装されているためです。

これはgenerateAddInvocationメソッドの問題ですか、それとも検証の呼び出しが間違っていますか?

4

1 に答える 1