9

我正在使用 Moq 框架进行单元测试,并希望能够通过 Action 来记录 void 方法。

let log = new Mock<ILog>()
let quot = <@ fun (mock:ILog) -> mock.Info(It.IsAny<string>) @>  
let expr = (quot.ToLinqExpression() :?> Expression<Action<ILog>>)
log.Verify(expr)

此代码失败并出现以下错误:

System.InvalidCastException:无法将类型为“System.Linq.Expressions.MethodCallExpressionN”的对象转换为类型“System.Linq.Expressions.Expression 1[System.Action1[log4net.ILog]]”。

我可以使用打印类型

printfn "%s" (quot.Type.ToString())

哪个输出

Microsoft.FSharp.Core.FSharpFunc`2[log4net.ILog,Microsoft.FSharp.Core.Unit]

那么,我怎样才能创建一个动作呢?

4

2 回答 2

14

F# 3 完全支持 LINQ 表达式,因此您现在可以将 Action 作为lambda 表达式传递给 Moq :

let mock = Mock<ILog>()
mock.Verify(fun (log:ILog) -> log.Info(It.IsAny<string>()))
于 2013-01-27T17:32:53.123 回答
5

尝试:

let quot = <@ new Action<_>(fun (mock:ILog) -> mock.Info(It.IsAny<string>)) @>
于 2012-04-03T18:19:25.697 回答