2012-04-03 9 views
7

Ich benutze das Moq-Framework für Komponententests und möchte in der Lage sein, Aktion für das Protokollieren void Methoden übergeben.Wie kann ich eine Aktion <T> in F # erstellen?

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) 

Dieser Code schlägt mit dem folgenden Fehler:

System.InvalidCastException : Unable to cast object of type 'System.Linq.Expressions.MethodCallExpressionN' to type 'System.Linq.Expressions.Expression 1[System.Action 1[log4net.ILog]]'.

ich die Art

mit drucken können aus
printfn "%s" (quot.Type.ToString()) 

die

gibt

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

Also, wie kann ich eine Aktion erstellen?

+1

Moq in F # -> wahrscheinlich eine schlechte Idee . –

+1

Yeps, in F #, wir Foq stattdessen - siehe http://trelford.com/blog/post/Foq.aspx und http://trelford.com/blog/post/FoqItEasy.aspx (sehr einfacher Übergang von Moq) –

Antwort

5

Versuchen:

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

Dies hat die Aktion korrekt erstellt, aber für Moq ist es immer noch nicht gelungen. – YonahW

12

LINQ Ausdrücke werden in F # 3 vollständig unterstützt, so können Sie jetzt eine Aktion Moq als lambda expression passieren:

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