Как я могу создать Действие <T>в F #? - PullRequest
8 голосов
/ 03 апреля 2012

Я использую инфраструктуру Moq для модульного тестирования и хотел бы иметь возможность перейти в Action для регистрации пустых методов.

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]

Итак, как я могу создать Действие?

Ответы [ 2 ]

13 голосов
/ 27 января 2013

Выражения LINQ полностью поддерживаются в F # 3, поэтому теперь вы можете передавать действие в Moq в виде лямбда-выражения :

let mock = Mock<ILog>()
mock.Verify(fun (log:ILog) -> log.Info(It.IsAny<string>()))
5 голосов
/ 03 апреля 2012

Попробуйте:

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