web-dev-qa-db-fra.com

Moq - Les membres non remplaçables ne peuvent pas être utilisés dans les expressions de configuration / vérification

Je suis nouveau à Moq. Je me moque d'une classe PagingOptions. Voici à quoi ressemble la classe:

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
            };
        }
    }

Voici ma version simulée de la classe,

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

J'obtiens l'erreur ci-dessous lors de la configuration des valeurs de propriété. Suis-je en train de faire quelque chose de mal. On dirait que je ne peux pas la classe de béton Moq? Seules les interfaces peuvent être moquées? Veuillez aider.

moq error

Merci, Abdul

20
fingers10

Moq crée une implémentation du type simulé. Si le type est une interface, il crée une classe qui implémente l'interface. Si le type est une classe, il crée une classe héritée et les membres de cette classe héritée appellent la classe de base. Mais pour ce faire, il doit passer outre les membres. Si une classe a des membres qui ne peuvent pas être remplacés (ils ne sont pas virtuels, abstraits), Moq ne peut pas les remplacer pour ajouter ses propres comportements.

Dans ce cas, il n'est pas nécessaire de se moquer de PagingOptions car il est facile d'en utiliser un réel. Au lieu de cela:

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

Faites ceci:

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

Comment déterminer s'il faut ou non se moquer de quelque chose? De manière générale, nous nous moquons de quelque chose si nous ne voulons pas inclure l'implémentation d'exécution concrète dans notre test. Nous voulons tester une classe et non les deux en même temps.

Mais dans ce cas, PagingOptions est juste une classe qui contient des données. Il ne sert à rien de s'en moquer. Il est tout aussi facile d'utiliser la vraie chose.

38
Scott Hannen