web-dev-qa-db-fra.com

Moq vérifier avec le paramètre d'objet

J'essaie de vérifier un paramètre qui est une classe. Le code testé est correct. Le bug est en cours de test.

J'ai essayé deux méthodes, qui ont toutes deux échoué.

Voici mes tentatives:

1:

this.MockImageResizeFilter.Verify(m => m.Filter(this.UploadedFileData, new ImageFilterOptions()
    {
        Width = 256,
        Height = 256,
    }));

Cela échoue toujours, même si un objet transmis comme second paramètre a des propriétés égales. Le premier paramètre est vérifié correctement.

2:

this.MockImageResizeFilter.Setup(m => m.Filter(It.IsAny<byte[]>(), It.IsAny<ImageFilterOptions>()))
    .Callback<byte[], ImageFilterOptions>((data, options) =>
        {
            Assert.AreEqual(this.UploadedFileData, data, "data");
            Assert.AreEqual(filterOptions.Width, options.Width, "Width");
            Assert.AreEqual(filterOptions.Height, options.Height, "Height");
        }
    );

Cela passe toujours, même en cas d'échec. Les assertions du rappel échouent, mais l'exception n'est pas transmise au contexte externe et le test réussit donc toujours.

Pouvez-vous m'aider à trouver ce que je fais mal?

68
rhughes

La première tentative est plus proche de ce que vous souhaitez réaliser.

La raison de l'échec est que Moq utilise (probablement) Object.Equals Sous le couvercle pour tester si le paramètre ImageFilterOptions avec lequel la méthode a été appelée est la même instance que celle que vous avez fournie dans l'appel à Verify.

Il est impossible qu'elles soient la même instance, car dans Verify vous créez une new ImageFilterOptions().

Au lieu d'effectuer la vérification des paramètres de cette façon, vous pouvez utiliser la syntaxe It.Is De Moq pour fournir une expression qui vérifie que le paramètre est bien celui attendu.

Dans votre cas, vous souhaitez vérifier que le paramètre est de type ImageFilterOptions et que Width et Height sont définis sur 256. L'expression qui vous permet de le faire est:

It.Is<ImageFilterOptions>(p => p.Width == 256 && p.Height == 256)

Ainsi, votre appel à Verify pourrait ressembler à ceci:

this.MockImageResizeFilter.Verify(m => m.Filter(
            this.UploadedFileData,
            It.Is<ImageFilterOptions>(p => p.Width == 256 && p.Height == 256)));
109
Cristian Lupascu