2012-04-03 2 views
7

단위 테스트를 위해 Moq 프레임 워크를 사용 중이며 void 메소드 로깅을 위해 Action을 전달할 수 있기를 원합니다. 어떻게 내가 할 수있는, 내가F #에서 <T> 액션을 만들려면 어떻게해야합니까?

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

그래서 출력

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

사용 유형을 인쇄 할 수 있습니다

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) 

이 코드는 다음과 같은 오류와 함께 실패 액션을 만드시겠습니까?

+1

MOQ F에 # -> 아마 좋은 생각 . –

+1

F #에서는 Foq 대신 http://trelford.com/blog/post/Foq.aspx 및 http://trelford.com/blog/post/FoqItEasy.aspx (Moq에서 아주 쉽게 전환) –

답변

5

시도 :

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

이것은 정확하게 행동을 만들었지 만 Moq에게는 여전히 효과가 없었습니다. – YonahW

12

LINQ 식을 완전히 F # 3에서 지원됩니다, 그래서 당신은 지금 lambda expression로 MOQ에 작업을 전달할 수 있습니다

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