Comment puis-je utiliser Moq pour se moquer d'une méthode d'extension?
Je suis en train d'écrire un test qui repose sur les résultats d'une méthode d'extension, mais je ne veux pas d'un futur échec de cette méthode d'extension à jamais briser ce test. Se moquant de ce résultat semblait être le choix évident, mais Moq ne semble pas offrir un moyen de surcharger une méthode statique (une demande pour une extension de la méthode). Il y a une idée similaire avec Moq.Protégés et de Moq.Stub, mais ils ne semblent pas offrir quelque chose pour ce scénario. Ai-je raté quelque chose ou dois-je aller sur ce une manière différente?
Voici un exemple trivial qui échoue avec l'habitude "Invalide attente sur un non-substituables membre". C'est un mauvais exemple d'avoir besoin de se moquer d'une méthode d'extension, mais elle devrait faire.
public class SomeType {
int Id { get; set; }
}
var ListMock = new Mock<List<SomeType>>();
ListMock.Expect(l => l.FirstOrDefault(st => st.Id == 5))
.Returns(new SomeType { Id = 5 });
Comme pour tout TypeMock junkies qui pourrait me suggère d'utiliser un Isolateur à la place: j'apprécie l'effort fait qu'il ressemble à TypeMock pourrait faire le travail, les yeux bandés et en état d'ébriété, mais notre budget n'est pas en augmentant tout moment bientôt.
- Un duplicata peut être trouvé ici: stackoverflow.com/questions/2295960/....
- Cette question est l'ensemble d'un an de plus que celui-là. Si, il y a duplication, il va dans l'autre sens.
- Toujours pas de solution appropriée en 2019!
Vous devez vous connecter pour publier un commentaire.
Les méthodes d'Extension sont juste des méthodes statiques dans le déguisement. Se moquant de cadres comme Moq ou Rhinomocks ne peut se moquer de créer des instances d'objets, cela signifie se moquant de méthodes statiques n'est pas possible.
Si vous pouvez changer les méthodes d'extension de code que vous pouvez coder comme ceci pour être en mesure de tester:
Donc l'extension des méthodes sont seulement un wrapper autour de la mise en œuvre de l'interface.
(Vous pouvez utiliser seulement à la mise en œuvre de la classe sans les méthodes d'extension qui sont des sortes de sucre syntaxique.)
Et vous pouvez vous moquer de la mise en œuvre de l'interface et la définir comme la mise en œuvre des extensions de la classe.
Je sais que cette question n'a pas été actif pendant environ un an, mais Microsoft a publié un cadre pour traiter exactement de ce qu'on appelle Les taupes.
Voici quelques tutoriels ainsi:
J'ai créé une classe wrapper pour l'extension des méthodes que j'ai eu besoin de se moquer.
Ensuite, vous pouvez simuler le wrapper méthodes dans vos tests et le code avec votre conteneur IOC.
Pour les méthodes d'extension j'ai l'habitude d'utiliser l'approche suivante:
Il permet d'injecter _doSumm assez facile.