webentwicklung-frage-antwort-db.com.de

Moq - Nicht überschreibbare Mitglieder dürfen nicht in Setup- / Verifizierungsausdrücken verwendet werden

Ich bin neu bei Moq. Ich verspotte eine PagingOptions Klasse. So sieht die Klasse aus:

public class PagingOptions
    {
        [Range(1, 99999, ErrorMessage = "Offset must be greater than 0.")]
        public int? Offset { get; set; }

        [Range(1, 100, ErrorMessage = "Limit must be greater than 0 and less than 100.")]
        public int? Limit { get; set; }

        public PagingOptions Replace(PagingOptions newer)
        {
            return new PagingOptions
            {
                Offset = newer.Offset ?? Offset,
                Limit = newer.Limit ?? Limit
            };
        }
    }

Hier ist meine Scheinversion der Klasse,

var mockPagingOptions = new Mock<PagingOptions>();
            mockPagingOptions.Setup(po => po.Limit).Returns(25);
            mockPagingOptions.Setup(po => po.Offset).Returns(0);

Beim Einrichten der Eigenschaftswerte wird der folgende Fehler angezeigt. Mache ich etwas falsch Sieht aus wie ich nicht Moq Betonklasse kann? Nur Schnittstellen können verspottet werden? Bitte helfen.

(moq error

Danke, Abdul

20
fingers10

Moq erstellt eine Implementierung des verspotteten Typs. Wenn der Typ eine Schnittstelle ist, wird eine Klasse erstellt, die die Schnittstelle implementiert. Wenn der Typ eine Klasse ist, wird eine geerbte Klasse erstellt, und die Mitglieder dieser geerbten Klasse rufen die Basisklasse auf. Dazu muss es jedoch die Mitglieder überschreiben. Wenn eine Klasse Mitglieder hat, die nicht überschrieben werden können (sie sind nicht virtuell, abstrakt), kann Moq sie nicht überschreiben, um ihr eigenes Verhalten hinzuzufügen.

In diesem Fall müssen Sie PagingOptions nicht verspotten, da es einfach ist, ein echtes zu verwenden. An Stelle von:

var mockPagingOptions = new Mock<PagingOptions>();
        mockPagingOptions.Setup(po => po.Limit).Returns(25);
        mockPagingOptions.Setup(po => po.Offset).Returns(0);

Mach das:

var pagingOptions = new PagingOptions { Limit = 25, Offset = 0 };

Wie bestimmen wir, ob wir etwas verspotten sollen oder nicht? Im Allgemeinen verspotten wir etwas, wenn wir die konkrete Laufzeitimplementierung nicht in unseren Test einbeziehen möchten. Wir wollen eine Klasse testen, nicht beide gleichzeitig.

In diesem Fall ist PagingOptions jedoch nur eine Klasse, die einige Daten enthält. Es macht wirklich keinen Sinn, sich darüber lustig zu machen. Es ist genauso einfach, die reale Sache zu benutzen.

38
Scott Hannen