Verspotten von Delegate.Invoke () mit Moq löst die InvalidCast-Ausnahme in LINQ aus

8

Nehmen wir an, ich habe IService interface:

%Vor%

Und ein Delegat Func<IService> , das diese Schnittstelle zurückgibt.

In meinem Komponententest möchte ich die Invoke() -Methode des Delegierten mit Moq wie folgt vortäuschen:

%Vor%

Leider mockDelegate.Setup(...) throws System.InvalidCastException :

  

Testmethode   UnitTest hat Ausnahme ausgelöst:

     

System.InvalidCastException: Darf das Objekt des Typs 'System.Linq.Expressions.InstanceMethodCallExpressionN' nicht umwandeln   Type 'System.Linq.Expressions.InvocationExpression'.

     

bei Moq.ExpressionExtensions.GetCallInfo (LambdaExpression Ausdruck, Mock Mock)

     

bei Moq.Mock. & lt; & gt; c_ DisplayClass1c'2.b _1b ()

     

bei Moq.PexProtector.Invoke (Func'1-Funktion)

     

bei Moq.Mock.Setup (Mock 1 mock, Expression 1 Ausdruck, Bedingung Bedingung)

     

bei Moq.Mock 1.Setup(Expression 1 Ausdruck)

     

bei UnitTest () in UnitTests.cs: Zeile 38

Zeile 38 ist mockDelegate.Setup(x => x.Invoke()).Returns(mockService.Object);

Vermisse ich etwas? Oder ist es keine gute Idee, den Aufruf von Delegierten zu verspotten?

Danke.

    
Nikolai Samteladze 23.01.2014, 01:28
quelle

2 Antworten

20

Es ist 100% möglich dies in Moq zu tun, hier ist wie:

%Vor%

Der Grund, warum Sie InvalidCastException erhalten haben, war, dass Sie eine Mock<T> eines Delegattyps erstellen. Daher erwartet das Expression vom Typ InvocationExpression ( x() ) anstatt InstanceMethodCallExpressionN ( x.Invoke() ).

Damit können Sie auch Aufrufe Ihres Mock -Delegaten überprüfen, z. B.

%Vor%

Ich habe dies als Antwort gepostet, weil es für diese Situation vielleicht nicht notwendig ist, aber es kann nützlich sein, es zu wissen.

    
Lukazoid 11.09.2014, 18:20
quelle
1

Diese Antwort ist eine Zusammenfassung der Kommentare SLaks und nemesv .

Es gibt keinen Grund, Func<IService> delegate vorzuspielen. Stattdessen kann man schreiben:

%Vor%

Die Ausnahme ist da, weil dieses Szenario nicht von Moq unterstützt wird. Aber anstatt eine NotSupportException zu werfen, bekommst du nicht so schöne InvalidCastException .

    
Nikolai Samteladze 23.01.2014 18:09
quelle

Tags und Links