I am using the Moq framework for unit testing and would like to be able to pass in Action for logging void methods.
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)
This code fails with the following error:
System.InvalidCastException : Unable to cast object of type 'System.Linq.Expressions.MethodCallExpressionN' to type 'System.Linq.Expressions.Expression
1[System.Action
1[log4net.ILog]]'.
I can print the type out using
printfn "%s" (quot.Type.ToString())
which outputs
Microsoft.FSharp.Core.FSharpFunc`2[log4net.ILog,Microsoft.FSharp.Core.Unit]
So, how can I create an Action?
LINQ Expressions are fully supported in F# 3, so you can now pass an Action to Moq as a lambda expression :
let mock = Mock<ILog>()
mock.Verify(fun (log:ILog) -> log.Info(It.IsAny<string>()))
尝试:
let quot = <@ new Action<_>(fun (mock:ILog) -> mock.Info(It.IsAny<string>)) @>
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.