Autofixture: Abrufen einer von AutoMoqData erstellten Instanz der inneren Schnittstelle.

Erstellt am 26. Apr. 2018  ·  8Kommentare  ·  Quelle: AutoFixture/AutoFixture

Hi,

Ich versuche, die Instanz der von AutoMoqData erstellten inneren Mocked-Schnittstelle zu erhalten, um die Schnittstelle einzurichten.

Gibt es eine Möglichkeit so etwas zu machen

[Theory, AutoMoqData]
public void Dummy(IFixture fixture, ComplexClassWithInnerInterface sut)
{
    fixture.GetInstance<IInnerInterfaceMockCreatedByAutoMoqData>().Setup(x => x.Method).Result(something);

    Assert.Equal(String.Empty, String.Empty);
}

Vielen Dank

question

Hilfreichster Kommentar

Danke @xlecoustillier für die tolle Antwort. Grundsätzlich würde ich vorschlagen, dasselbe zu tun, da ich in meinen Tests ständig diesem Muster folge.

Aber für 30 Interfaces ist es ziemlich hässlich, sie in Methodenparametern zu haben.

Nun, dieses Argument sieht ein bisschen seltsam aus. Wahrscheinlich falsch, es ist etwas mit dem Design des getesteten Code , wenn Sie konfigurieren 30 Abhängigkeiten müssen ein Szenario machen 😟 Ich bin 99% @ploeh Sie würde vorschlagen , den Code zuerst , bevor Sie fortfahren zu überprüfen, nach seinem Rat es wird empfohlen zu haben , max 3-4 Abhängigkeiten

Es scheint also unmöglich, automatisch erstellte Mocks aus dem Container des Fixtures zu bekommen. Sie werden standardmäßig nicht injiziert. Wenn das Gerät also eine GetInstance-ähnliche Methode hatte, wird nichts für die automatisch erstellten Mocks zurückgegeben.

Ich bin mir nicht 100% sicher, ob ich die ganze Botschaft klar verstanden habe, aber nach dem, was ich habe, hast du Recht. Standardmäßig sind alle generierten Objekte vorübergehend und fixture behält sie nicht bei. Wenn Sie das bestimmte Objekt zu einem Singleton machen möchten, sollten Sie das Attribut fixture.Freeze<>() API oder [Frozen] oder eine andere geeignete API verwenden.
Das vorhandene Standardverhalten wurde entwickelt, um die gängigen Szenarien abzudecken, und in den meisten Fällen _will man nicht das gleiche Objekt pro Typ haben.

Wenn Sie noch Hilfe von unserer Seite suchen, geben Sie bitte genauere Anforderungen an, die Sie haben. Teilen Sie besser genug Code, um die aktuellen Einschränkungen und das Ziel zu demonstrieren, das Sie erreichen möchten - das hilft, besser zu synchronisieren 😉

Vielen Dank.

Alle 8 Kommentare

Versuchen

Mock.Get(sut).Setup(x => x.Method).Result(something);

Sie erhalten die Objektinstanz wurde nicht von Moq erstellt. Zugriff auf sut.

Dies funktioniert tatsächlich, wenn sich die Schnittstelle in einer öffentlichen Eigenschaft befindet.
Mock.Get(sut.InnerInterface).Setup(x => x.Method).Ergebnis(etwas);

Aber was ist, wenn die Schnittstelle verspottet und vom Konstruktor injiziert, im IoC-Container registriert, aber in sut mit einer öffentlichen Eigenschaft nicht zugänglich ist?

In diesem Fall müssen Sie den Mock einfrieren, um sicherzustellen, dass die von Ihnen generierte Instanz auch in die sut injiziert wird:

[Theory, AutoMoqData]
public void Dummy(
    IFixture fixture, 
    [Frozen]Mock<YourInnerInterface> innerInterfaceMock,
    ComplexClassWithInnerInterface sut)
{
    innerInterfaceMock.Setup(x => x.Method).Result(something);
    sut.DoSomething();
    Assert.Equal(String.Empty, String.Empty);
}

Achten Sie darauf, die gefrorenen Mocks immer vor der Sut zu erstellen, damit sie beim Erstellen der Sut bereits vorhanden sind und daher korrekt injiziert werden.

Siehe ploehsblog als Referenz.

Hi,
Das habe ich schon gemacht. Aber für 30 Interfaces ist es ziemlich hässlich, sie in Methodenparametern zu haben.
Ihr Code hat mich daran erinnert, dass AutoMoqData nicht alle vermeintlichen Schnittstellen einfriert. Es scheint also unmöglich, automatisch erstellte Mocks aus dem Container des Fixtures zu bekommen. Sie werden standardmäßig nicht injiziert. Wenn das Gerät also eine GetInstance-ähnliche Methode hatte, wird nichts für die automatisch erstellten Mocks zurückgegeben. Deshalb bekomme ich Duplikate, wenn ich den Mock mit der Fixture-Instanz einfriere. Ich sehe nur, dass es funktionieren würde, wenn die Sut mit den später eingefrorenen Mocks aktualisiert werden könnte, aber das wäre hässlich. Der einfache Weg besteht darin, AutoMoqData zu verwenden, um das IFixture zu erstellen, Mocks in der Testmethode einzufrieren und einzurichten und dann sut zu erstellen. Mit diesem Setup kann ich eine wiederverwendbare Hilfsmethode zum Einfrieren und Einrichten von Mocks erstellen.

Vielen Dank

Danke @xlecoustillier für die tolle Antwort. Grundsätzlich würde ich vorschlagen, dasselbe zu tun, da ich in meinen Tests ständig diesem Muster folge.

Aber für 30 Interfaces ist es ziemlich hässlich, sie in Methodenparametern zu haben.

Nun, dieses Argument sieht ein bisschen seltsam aus. Wahrscheinlich falsch, es ist etwas mit dem Design des getesteten Code , wenn Sie konfigurieren 30 Abhängigkeiten müssen ein Szenario machen 😟 Ich bin 99% @ploeh Sie würde vorschlagen , den Code zuerst , bevor Sie fortfahren zu überprüfen, nach seinem Rat es wird empfohlen zu haben , max 3-4 Abhängigkeiten

Es scheint also unmöglich, automatisch erstellte Mocks aus dem Container des Fixtures zu bekommen. Sie werden standardmäßig nicht injiziert. Wenn das Gerät also eine GetInstance-ähnliche Methode hatte, wird nichts für die automatisch erstellten Mocks zurückgegeben.

Ich bin mir nicht 100% sicher, ob ich die ganze Botschaft klar verstanden habe, aber nach dem, was ich habe, hast du Recht. Standardmäßig sind alle generierten Objekte vorübergehend und fixture behält sie nicht bei. Wenn Sie das bestimmte Objekt zu einem Singleton machen möchten, sollten Sie das Attribut fixture.Freeze<>() API oder [Frozen] oder eine andere geeignete API verwenden.
Das vorhandene Standardverhalten wurde entwickelt, um die gängigen Szenarien abzudecken, und in den meisten Fällen _will man nicht das gleiche Objekt pro Typ haben.

Wenn Sie noch Hilfe von unserer Seite suchen, geben Sie bitte genauere Anforderungen an, die Sie haben. Teilen Sie besser genug Code, um die aktuellen Einschränkungen und das Ziel zu demonstrieren, das Sie erreichen möchten - das hilft, besser zu synchronisieren 😉

Vielen Dank.

Ja, ich würde vorschlagen, dass 30 Abhängigkeiten zu viel sind.

In Bezug auf die injizierten Abhängigkeiten ist die Verwendung des [Frozen] Attributs, wie @xlecoustillier vorschlägt, eine Option und tatsächlich der Grund, warum dieses Attribut ursprünglich existiert.

Die Verwendung von Mock.Get(sut.Dep1) ist auch eine Option, die ich oft verwende.

Aber was ist, wenn die Schnittstelle [...] vom Konstruktor injiziert wird, [...] aber in sut mit einer öffentlichen Eigenschaft nicht zugänglich ist?

Warum also nicht als Eigenschaft ausgeben? Was Sie komponieren, können Sie auch ausstellen. . Es bricht die Kapselung nicht, um es freizulegen.

Ich möchte @ploeh hinzufügen, indem ich bereitzustellen , ohne Ihre Abstraktion zu bereichern, was nichts anderes wäre, als Ihre Implementierung durchsickern zu lassen!

@malylemire1 Dies wird geschlossen, da anscheinend keine weitere Hilfe erforderlich ist. Bitte lassen Sie es uns wissen, wenn wir Ihnen sonst noch helfen können 😉

Danke, dass du die Frage noch einmal gestellt hast! 👍

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

Ridermansb picture Ridermansb  ·  4Kommentare

ploeh picture ploeh  ·  7Kommentare

ecampidoglio picture ecampidoglio  ·  7Kommentare

Accc99 picture Accc99  ·  4Kommentare

Eldar1205 picture Eldar1205  ·  5Kommentare