我有这样的界面
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 中的函数返回 false,因为他expectedMethod
有一个ParameterInfo.ParameterType
ofSystem.Collections.Generic.IEnumerable``1[Result]
并且actual.Method
有一个ParameterInfo.ParameterType
of System.Collections.Generic.IEnumerable``1[T]
。
我尝试添加和删除类型参数无济于事。我需要接口中的类型参数(和任务),因为它是由 C# 中的其他人实现的。
这是generateAddInvocation
方法的问题还是我调用验证错误?