Yon*_*ahW 8 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)
Run Code Online (Sandbox Code Playgroud)
此代码失败,并显示以下错误:
System.InvalidCastException:无法将类型为'System.Linq.Expressions.MethodCallExpressionN'的对象强制转换为'System.Linq.Expressions.Expression
1[System.Action
1 [log4net.ILog]]'.
我可以使用打印出来的类型
printfn "%s" (quot.Type.ToString())
Run Code Online (Sandbox Code Playgroud)
哪个输出
Microsoft.FSharp.Core.FSharpFunc`2 [log4net.ILog,Microsoft.FSharp.Core.Unit]
那么,我该如何创建一个Action呢?
Phi*_*ord 13
FQ 3完全支持LINQ表达式,因此您现在可以将Action作为lambda表达式传递给Moq :
let mock = Mock<ILog>()
mock.Verify(fun (log:ILog) -> log.Info(It.IsAny<string>()))
Run Code Online (Sandbox Code Playgroud)
尝试:
let quot = <@ new Action<_>(fun (mock:ILog) -> mock.Info(It.IsAny<string>)) @>
Run Code Online (Sandbox Code Playgroud)