私はこのようなインターフェースを持っています
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 が発生します。methodsMatch
Foqの関数expectedMethod
はfalseParameterInfo.ParameterType
を返しSystem.Collections.Generic.IEnumerable``1[Result]
ます。actual.Method
ParameterInfo.ParameterType
System.Collections.Generic.IEnumerable``1[T]
型パラメーターの追加と削除を試みましたが、役に立ちませんでした。インターフェイスに型パラメーター (およびタスク) が必要です。これは、C# で他の人によって実装されているためです。
これはgenerateAddInvocation
メソッドの問題ですか、それとも検証の呼び出しが間違っていますか?