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.SetAsync.AwaitTask

这一切都很好,Foq 很棒。但是,验证会引发 system.exception。methodsMatchFoq 中的函数返回 false,因为他expectedMethod有一个ParameterInfo.ParameterTypeofSystem.Collections.Generic.IEnumerable``1[Result]并且actual.Method有一个ParameterInfo.ParameterTypeof System.Collections.Generic.IEnumerable``1[T]

我尝试添加和删除类型参数无济于事。我需要接口中的类型参数(和任务),因为它是由 C# 中的其他人实现的。

这是generateAddInvocation方法的问题还是我调用验证错误?

4

1 回答 1

2

这是当前 Foq 1.1 实现中的一个问题,其中针对通用接口方法的验证失败。该问题与generateAddInvocation下面使用MethodBase.GetCurrentMethod记录每个调用的方法的方法有关。MethodBase.GetCurrentMethod返回泛型方法定义,其中验证方法使用的代码引用接收类型参数。

我已经应用了一个简单的修复:https ://foq.codeplex.com/SourceControl/changeset/69435c83aabd

该修复将成为 Foq 1.2 的一部分。

于 2013-09-30T21:38:54.793 回答