Autofixture: Frage: Verschachtelte Abhängigkeits-Mocks mit AutoMoqCustomization einrichten

Erstellt am 15. Apr. 2016  ·  5Kommentare  ·  Quelle: AutoFixture/AutoFixture

Ich habe versucht, AutoMoqCustomization zu verwenden, um ein Objektdiagramm mit verschachtelten Abhängigkeiten automatisch nachzuahmen, und die Ergebnisse sind nicht so, wie ich es erwartet hatte. Hier ist der Testcode, kann mir bitte jemand sagen, warum es nach dem Einfrieren eines Mock<IObject> eine Situation gibt, in der ein weiteres IObject das von Moq erstellt wurde, vom Fixture erstellt wird?

[TestClass]
    public class MyTestClass
    {
        [TestMethod]
        public void Test()
        {
            var fixture = new Fixture().Customize(new AutoMoqCustomization());

            var objMock = fixture.Freeze<Mock<IObject>>();
            var sut = fixture.Create<Dependant2>();

            sut.Obj.Should().BeSameAs(objMock);
        }
    }

    public interface IObject { }

    public interface IDependant { IObject Obj { get; } }

    public class MyObject : IObject { }

    public class Dependant2
    {
        public Dependant2(IDependant dependant)
        {
            Obj = dependant.Obj;
        }

        public IObject Obj { get; }
    }

Hilfreichster Kommentar

AutoMoqCustomization erstellt Scheinobjekte, richtet sie aber nicht ein.

Wenn Sie möchten, dass die Mitglieder des Mocks eingerichtet werden, sollten Sie stattdessen AutoConfiguredMoqCustomization verwenden. Es wird a) die öffentlich einstellbaren Eigenschaften des Mocks einstellen und b) Methoden/Indexer einrichten, um Werte zurückzugeben (und zu speichern), die vom Gerät träge generiert wurden

Es gibt zwei Einschränkungen. Es wird nicht eingerichtet:

  • Methoden mit ref Parametern
  • generische Methoden

Weitere Informationen am Ende des Spickzettels .

Alle 5 Kommentare

AutoMoqCustomization erstellt Scheinobjekte, richtet sie aber nicht ein.

Wenn Sie möchten, dass die Mitglieder des Mocks eingerichtet werden, sollten Sie stattdessen AutoConfiguredMoqCustomization verwenden. Es wird a) die öffentlich einstellbaren Eigenschaften des Mocks einstellen und b) Methoden/Indexer einrichten, um Werte zurückzugeben (und zu speichern), die vom Gerät träge generiert wurden

Es gibt zwei Einschränkungen. Es wird nicht eingerichtet:

  • Methoden mit ref Parametern
  • generische Methoden

Weitere Informationen am Ende des Spickzettels .

Danke für schnelle Antwort! Ich habe AutoConfiguredMoqCustomization mit Methode anstelle von Eigenschaft in IDependant ausprobiert und die eingefrorene Instanz respektiert. Gibt es eine Möglichkeit, auch nicht einstellbare Eigenschaften zu respektieren? Mit Moq kann man einen Property Getter einrichten, auch wenn kein Setter vorhanden ist.

Eigentlich egal. Es richtet auch Get-Only-Eigenschaften ein, mein Fehler.

Ich erinnere mich auch an einen Fehler in Moq, der AutoMoq störte, wodurch es nicht möglich war, Nur-Get-Eigenschaften einzurichten. Als ich mir das ansah, musste man zumindest die Moq-Version 4.2.1409.1722 oder niedriger verwenden (Details unter #434). Vielleicht wurde der Fehler in neueren Versionen von Moq behoben, ich bin mir nicht sicher.

Ich habe die höchste Moq-Version ausprobiert, die niedriger als 4.2.1409.1722 ist, und Sie haben Recht, sie funktioniert auch für Nur-Get-Eigenschaften. Der Moq-Bug wurde in einer neueren Version nicht behoben, da ich es mit der neuesten versucht habe. Vielen Dank für Ihre Hilfe

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen