2012-04-03 18 views
7

Korzystam z frameworka Moq do testowania jednostkowego i chciałbym móc przekazać w akcji do rejestrowania nieważnych metod.Jak mogę utworzyć działanie <T> w 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) 

Kod ten nie powiedzie się z powodu następującego błędu:

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

mogę wydrukować typ przy użyciu

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

który wyprowadza

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

Więc, jak mogę stworzyć akcję?

+1

Moq w F # -> chyba zły pomysł . –

+1

Tak, w F #, zamiast tego mamy Foq - patrz http://trelford.com/blog/post/Foq.aspx i http://trelford.com/blog/post/FoqItEasy.aspx (Bardzo łatwe przejście z Moq) –

Odpowiedz

5

Spróbuj:

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

To utworzyło akcję poprawnie, ale nadal nie działało dla Moq. – YonahW

12

wyrażeń LINQ są w pełni obsługiwane w F # 3, dzięki czemu można teraz przejść akcję do Min jako lambda expression:

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