MOQ vérifiez avec le paramètre d'objet

J'essaie de vérifier un paramètre qui est une classe. Le code testé est bien. Le bug est dans le 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 passé en tant que deuxième 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 quand il devrait échouer. Les assertions dans le rappel échouent, mais le l'exception n'est pas passée au contexte externe, et donc le test passe toujours.

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

47
demandé sur rhughes 2012-11-21 18:48:34

1 réponses

La première tentative est plus proche de ce que vous voulez atteindre.

La raison pour laquelle il échoue est que Moq utilise (probablement) Object.Equals sous la couverture 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 pour eux d'être la même instance, car dans Verify vous créez un 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 un expression qui vérifie le paramètre était celui attendu.

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

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

Donc, votre appel à Verify pourrait ressembler à ceci:

this.MockImageResizeFilter.Verify(m => m.Filter(
            this.UploadedFileData,
            It.Is<ImageFilterOptions>(p => p.Width == 256 && p.Height == 256)));
77
répondu GolfWolf 2012-11-21 15:30:49