如何在F#中创建Action <t>?</t>

时间:2012-04-03 17:34:45

标签: linq f# quotations

我正在使用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.Action 1 [log4net.ILog]]'。

我可以使用

打印输出类型
printfn "%s" (quot.Type.ToString())

输出

  

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

那么,我该如何创建一个Action?

2 个答案:

答案 0 :(得分:13)

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

let mock = Mock<ILog>()
mock.Verify(fun (log:ILog) -> log.Info(It.IsAny<string>()))

答案 1 :(得分:5)

尝试:

let quot = <@ new Action<_>(fun (mock:ILog) -> mock.Info(It.IsAny<string>)) @>