2012-04-03 26 views
7

Birim sınama için Moq çerçevesini kullanıyorum ve geçersiz yöntemleri günlüğe kaydetmek için Eylemi iletebilmek istiyorum. Nasıl verebilirim, benF # içinde bir Action <T> nasıl oluşturabilirim?

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

Yani çıkışı

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

kullanarak türünü yazdırabilirsiniz

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

:

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) 

Bu kod aşağıdaki hata nedeniyle başarısız Eylem oluşturmak

+1

Moq F # -> muhtemelen kötü bir fikir . –

+1

Yeps, F #, biz bunu yerine atayız - bkz. Http://trelford.com/blog/post/Foq.aspx ve http://trelford.com/blog/post/FoqItEasy.aspx (Moq'dan çok kolay geçiş) –

cevap

5

Dene:

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

Bu eylemi doğru bir şekilde oluşturdu ancak yine de Moq için çalışmadı. – YonahW

12

LINQ İfadeler tamamen F # 3 desteklenir, böylece artık bir lambda expression olarak MOQ bir Eylem geçirebilirsiniz:

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