2012-04-03 19 views
7

Tôi đang sử dụng khung công tác Moq để kiểm tra đơn vị và muốn có thể chuyển sang Hành động để ghi nhật ký các phương thức void.Làm cách nào để tạo một Action <T> trong 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) 

Mã này không thành công với các lỗi sau:

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

tôi có thể in các loại bằng cách sử dụng

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

mà kết quả đầu ra

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

Vì vậy, làm thế nào tôi có thể tạo một hành động?

+1

Moq trong F # -> có lẽ là một ý tưởng tồi . –

+1

Yeps, trong F #, chúng tôi thay thế Foq - xem http://trelford.com/blog/post/Foq.aspx và http://trelford.com/blog/post/FoqItEasy.aspx (Chuyển đổi rất dễ dàng từ Moq) –

Trả lời

5

Hãy thử:

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

Điều này tạo ra các hành động một cách chính xác nhưng vẫn không làm việc cho Moq. – YonahW

12

LINQ Expressions được hỗ trợ đầy đủ trong F # 3, vì vậy bây giờ bạn có thể vượt qua một hành động để Moq như một lambda expression:

let mock = Mock<ILog>() 
mock.Verify(fun (log:ILog) -> log.Info(It.IsAny<string>())) 
Các vấn đề liên quan