Linq 如何创建动作<;T>;在F#中?

Linq 如何创建动作<;T>;在F#中?,linq,f#,quotations,Linq,F#,Quotations,我正在使用Moq框架进行单元测试,并且希望能够通过记录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)

我正在使用Moq框架进行单元测试,并且希望能够通过记录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)
哪个输出

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

那么,如何创建操作呢?

试试:

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

LINQ表达式在F#3中完全受支持,因此您现在可以将操作作为以下内容传递给Moq:

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

F#中的最小起订量->可能是个坏主意。是的,在F#中,我们改为Foq-请参见和(非常容易从最小起订量转换)这正确地创建了动作,但对于最小起订量仍然不起作用。
let quot = <@ new Action<_>(fun (mock:ILog) -> mock.Info(It.IsAny<string>)) @>
let mock = Mock<ILog>()
mock.Verify(fun (log:ILog) -> log.Info(It.IsAny<string>()))