Wie verweist man mithilfe von Microsoft Fakes auf einen Stub, der einen generischen Parameter für sich selbst hat?

StackOverflow https://stackoverflow.com//questions/12680378

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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top