Wie verweist man mithilfe von Microsoft Fakes auf einen Stub, der einen generischen Parameter für sich selbst hat?
-
12-12-2019 - |
Frage
Ich verwende Microsoft Fakes in einigen Unit-Tests, an denen ich arbeite.Meine Oberfläche sieht so aus:
interface ISecuredItem<TChildType> where TChildType : class, ISecuredItem<TChildType>
{
SecurityDescriptor Descriptor { get; }
IEnumerable<TChildType> Children { get; }
}
Eine typische Implementierung davon sieht so aus:
class RegistryKey : ISecuredItem<RegistryKey>
{
public SecurityDescriptor Descriptor { get; private set; }
public IEnumerable<RegistryKey> Children { get; }
}
Ich möchte diese Schnittstelle mit Microsoft Fakes verwenden und einen Stub für mich generieren lassen.Das Problem ist, dass die Form, die Fakes verwendet, so ist StubInterfaceNameHere<>
, also versuchen Sie im obigen Beispiel am Ende so etwas wie StubISecuredItem<StubISecuredItem<StubISecuredItem<StubISecuredItem....
Ist das möglich?Wenn ja, wie verwende ich Fakes auf diese Weise?
Lösung
Nach einigem Experimentieren habe ich eine funktionierende Lösung gefunden, obwohl sie nicht die eleganteste ist.
Dies ist Ihr regulärer Code:
public interface ISecuredItem<TChildType>
where TChildType : ISecuredItem<TChildType>
{
SecurityDescriptor Descriptor { get; }
IEnumerable<TChildType> Children { get; }
}
In Ihrem Testprojekt erstellen Sie eine StubImplementation-Schnittstelle
public interface StubImplemtation : ISecuredItem<StubImplemtation> { }
Dann können Sie in Ihrem Unit-Test Folgendes tun:
var securedItemStub = new StubISecuredItem<StubImplemtation>
{
ChildrenGet = () => new List<StubImplemtation>(),
DescriptorGet = () => new SecurityDescriptor()
};
var children = securedItemStub.ChildrenGet();
var descriptor = securedItemStub.DescriptorGet();
Sie können das Ganze überspringen StubImplementation
und nutzen RegistryKey
wenn das kein Problem ist.