我正在使用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?
答案 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>)) @>