2012-04-03 12 views
7

Estoy usando el marco Moq para pruebas unitarias y me gustaría poder pasar en Acción para registrar métodos vacíos.¿Cómo puedo crear una Acción <T> en F #?

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) 

Este código de error con el siguiente 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]]'.

puedo imprimir el tipo a cabo utilizando

printfn "%s" (quot.Type.ToString()) 

que da salida a

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

Así que, ¿cómo puedo crear una acción?

+1

Moq en Fa # -> probablemente una mala idea . –

+1

Yeps, en F #, en lugar de Foq, consulte http://trelford.com/blog/post/Foq.aspx y http://trelford.com/blog/post/FoqItEasy.aspx (transición muy fácil desde Moq) –

Respuesta

5

Probar:

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

Esto creó la acción correctamente, pero aún no funcionó para Moq. – YonahW

12

expresiones LINQ son totalmente compatibles con F # 3, por lo que ahora pueden pasar a una acción para Moq como lambda expression:

let mock = Mock<ILog>() 
mock.Verify(fun (log:ILog) -> log.Info(It.IsAny<string>())) 
Cuestiones relacionadas