Moq vérifie avec le paramètre d’object

J’essaie de vérifier un paramètre qui est une classe. Le code testé est correct. 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 object transmis en tant que 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(), It.IsAny())) .Callback((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 Assert dans le rappel échouent, mais l’exception n’est pas transmise au contexte externe et le test réussit toujours.

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

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

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

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

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

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

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

Ainsi, votre appel à Verify pourrait ressembler à ceci:

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