9
votes

FAÇON / MOCKING Une interface donne une erreur "Pas de constructeur par défaut", comment cela peut-il être?

J'essaie d'écrire un test unitaire d'une implémentation de référentiel. Le référentiel utilise Ravendb comme base de données. Pour les tests unitaires, je voudrais se moquer des pièces de Ravendbb. Afin de créer les moqueurs (faux), j'utilise Fakeditasy. Je pensais qu'il n'y aurait aucun problème avec la moqueur / la simulation car l'API de Ravendb est accessible via des interfaces.

Je pose cependant un problème lorsque vous essayez d'instancier une simulation spécifique. Les parties pertinentes de mon code de test de l'unité ressemblent à ceci: xxx

lors de l'instanciation du faux iravenchant, je reçois une exception. Ceci est le journal du puniner xunit.net: xxx

Le "pas de constructeur par défaut trouvé" n'a aucun sens depuis ce que j'essaie de simuler une interface . Quelqu'un a-t-il une suggestion quel est le problème?


5 commentaires

Je viens de remarquer que votre message d'exception mentionne "System.LINQ.IQUERYADY`1 [UserDocument]" , pas spécifiquement IravenQuiserisable . Êtes-vous sûr que l'exception ne se produit pas lorsque vous instaniez le iquéryable ?


Oui, je suis sûr. Cependant, IravenQuiserisable étend l'interface iquéryable, donc je suppose fausitéasy échoue lorsque vous essayez de simuler la partie iquérissable si iravenque ... ou quelque chose comme ça.


Le public utilisateur est-il public?


Vous avez raison de dire que le message d'exception n'a aucun sens, c'est un bug. Ce serait génial si vous pouviez fournir une solution vs qui reproduit le bogue et déposerait un problème ici: github.com/patrik-hagne/fakeitéasy/...


Pour que les gens arrivent à cette question en retard, notez qu'il y a eu des améliorations apportées à la "Impossible de simuler" les messages d'erreur de Fakeitéasy, à partir de 1.14.0. Ils ne sont pas parfaits, mais devraient être meilleurs. Voir Github.com/fakeeeasy/fakeitéasy/issues/157 pour plus de détails, si vous " Ve un esprit à.


4 Réponses :


2
votes

Est-ce que l'interface iravenquery a un où T: nouveau () type contrainte ?

Si oui, et userdocument ne fournit pas de CTOR sans paramètre, cela pourrait causer votre problème.


1 commentaires

Pour autant que je sache, il n'y a pas de contrainte de ce type sur iravenquerisable . Même s'il y a lieu, UserDocument a un constructeur sans paramètre.



11
votes

Vous êtes correct en ce que le message d'exception n'a aucun sens, c'est un bug. Ce serait génial si vous pouviez fournir une solution vs qui reproduit le bogue et déposera un problème ici: https : //github.com/patrik-hagne/fakeitéasy/

Le bogue est dans le fait que le message d'exception incorrecte est utilisé, mais il doit y avoir quelque chose de mal qui rend la fausse création va mal. Est le "UserDocument" -Type public? Si elle est interne et que vous avez donné à votre projet de test l'accès à l'utilisation de l'utilisation de InternalsVissibletoTribute, vous devez également donner l'accès à la bibliothèque de génération de proxy à celui-ci: https://fakeitéeasy.readthedocs.io/fr/Stable/ How-to-Fake-Types internes / # How-to-Fake-AMI-IN-VB-Types .


1 commentaires

2
votes

Je viens de courir dans cela, mais mon problème n'était pas autour des types internes. Mon problème était avec l'assemblage contenant le type qui n'est pas dans le dossier BIN du projet de test de l'unité.

Il semble que la fakeitéasy jette cette erreur lorsqu'il ne peut pas résoudre un type qu'il doit simuler. (Cela donne un sens pourquoi un type interne dans une autre assemblée provoquerait la même erreur.)

Donc, j'ai eu le projet FOO, qui est référencé par la barre de projet. Barre de projet avait une interface publique faisant référence à un type public de Project FOO. Project Bar.Test a une référence à la barre de projet, mais pas de projet FOO. Lorsque je construis la barre de bar.Test, bar.dll est placé dans le dossier bin mais foo.dll ne le fait pas. Lorsque Faketasey tente de simuler mon interface, il ne peut pas résoudre le type qui réside dans foo.dll.

Ajout d'une référence au projet FOO dans mon projet BAR.TESTS assuré que FOO.DLL se fraye un chemin et est là pour fausité facile et a fait disparaître cette erreur.

SO ...

Dans votre cas, il est possible que votre assembly Ravendb (que je suppose contient userdocument ) est uniquement référencé par votre projet réel et ne se copie pas à la sortie de votre unité de test d'unité.


1 commentaires

Je vais essayer de reproduire cela et d'obtenir un correctif le plus tôt possible.



3
votes

Je sais que c'est un ancien poste, mais j'ai couru dans le même problème. Ce que j'ai trouvé comme le problème était un type de retour de l'une des méthodes déclarées dans l'interface que j'essayais de simuler. Cette méthode renvoyait un objet d'une certaine classe et cette classe n'avait pas de constructeur par défaut avec lequel Fakeitéasy pourrait fonctionner. Si quelqu'un d'autre obtient cette erreur, essayez de vérifier les objets que votre interface est renvoyée et si les classes correspondantes ont les constructeurs par défaut.


1 commentaires

Comment voudriez-vous résoudre ce problème? Est-il possible de simuler la méthode qui renvoie un objet qui n'a pas de constructeur par défaut?