Nehmen wir an, ich habe IService
interface:
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:
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.
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.
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.
Diese Antwort ist eine Zusammenfassung der Kommentare SLaks
und nemesv
.
Es gibt keinen Grund, Func<IService>
delegate
vorzuspielen. Stattdessen kann man schreiben:
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
.
Tags und Links c# unit-testing linq moq delegates