Comment stub un Tapuscrit-Interface / Type de définition?
Je travaille avec des caractères d'imprimerie sur une AngularJS 1.X projet. J'utilise différentes bibliothèques Javascript à des fins différentes. À l'unité-test de ma source, je tiens à talon de certaines dépendances à l'aide de la Typings (= les interfaces). Je ne veux pas utiliser la TOUTE-type et ni d'écrire une méthode vide pour chaque méthode de l'interface.
Je cherche un moyen de faire quelque chose comme ça:
let dependency = stub(IDependency);
stub(dependency.b(), () => {console.log("Hello World")});
dependency.a(); //--> Compile, do nothing, no exception
dependency.b(); //--> Compile, print "Hello World", no exception
La douleur que j'ai actuellement, je utiliser any
et de mettre en œuvre toutes les méthodes qui sont appelés dans mon cas de test ou j'ai implémenter l'interface et de mettre en œuvre l'interface complète. C'est trop inutile de code :(.
Comment puis-je créer un objet qui a un vide de mise en œuvre pour chaque méthode et est tapé? J'utilise Sinon de se moquer de fins, mais je suis ouvert à utiliser d'autres bibliothèques.
PS: je sais que la Machine efface les interfaces...mais je tiens encore à résoudre :).
OriginalL'auteur user1879408 | 2016-05-04
Vous devez vous connecter pour publier un commentaire.
Je pense que la réponse courte est que c'est pas possible en caractères d'imprimerie, ainsi que la langue n'offre pas au moment de la compilation ou de l'exécution de "réflexion". Il n'est pas possible pour une maquette de la bibliothèque pour itérer les membres d'une interface.
Voir le sujet: https://github.com/Microsoft/TypeScript/issues/1549
C'est malheureux pour le TDD développeurs, dans lequel se moquant d'une dépendance est un élément central du processus de développement.
Il y a un certain nombre de techniques pour rapidement buter les méthodes, cependant, comme décrit par les autres réponses. Ces options peuvent faire le travail, avec un peu d'adaptation mentale.
OriginalL'auteur Jørgen Tvedt
J'ai écrit Tapuscrit tests à l'aide de qUnit et Sinon, et j'ai vécu exactement la même douleur que vous décrivez.
Supposons que vous avez une dépendance sur une interface comme:
J'ai réussi à éviter la nécessité de nouveaux outils/bibliothèques en utilisant un couple d'approches fondées sur sinon stubs/espions et de moulage.
Utiliser un objet vide littéral, alors affecter directement sinon talons pour les fonctions utilisées dans le code:
Usage littéral d'objet avec vide implémentations des méthodes nécessaires à votre code, puis les envelopper méthodes sinon espions/talons comme l'exige
Ils travaillent très agréable lorsque vous les combinez avec sinon les bacs à sable et les communes de l'installation/démontage comme celui fourni par qUnit modules.
Quelque chose comme ceci (à l'aide de la première option, mais fonctionne de la même façon que si vous utilisiez la deuxième option):
Je suis d'accord ce n'est pas encore la solution idéale, mais il fonctionne raisonnablement bien, n'a pas besoin de bibliothèques supplémentaires et conserve la quantité de code nécessaire à un faible niveau gérable.
OriginalL'auteur Daniel J.G.
Dernière TypeMoq (version 1.0.2) prend en charge se moquant de la Machine interfaces, aussi longtemps que le moteur d'exécution (nodejs/navigateur) prend en charge le Proxy de l'objet global présenté par l'ES6.
Donc, en supposant
IDependency
ressemble à ceci:puis en se moquant avec TypeMoq serait aussi simple que cela:
OriginalL'auteur florinn
Il y a quelques bibliothèques qui permet de faire
TypeMoq
,TeddyMocks
etTypescript-mockify
sont probablement l'un des plus populaires.Vérifier le github de référentiels et de choisir celui que vous aimez mieux :
liens:
Vous pouvez également utiliser de plus en plus populaire libs comme Sinon, mais d'abord vous devez utiliser un
<any>
type puis le réduire à<IDependency>
type (Comment puis-je utiliser Sinon avec Tapuscrit?)Ce que sur la création d'un vide de l'objet qui l'implémente l'interface ? et passer comme un objet de votre maquette ?
Ne pas créer les méthodes --> Type d'effacement 😉
Droit, alors la seule solution est de créer un outil qui fait ça :/
OriginalL'auteur PolishDeveloper
Il est maintenant possible. J'ai publié une version améliorée de la machine a ecrire un compilateur qui fait interfaces de métadonnées disponibles au moment de l'exécution. Par exemple, vous pouvez écrire:
et c'est la sortie:
Avec toutes ces informations, vous pouvez générer les stubs de la programmation, comme vous préférez.
Vous pouvez trouver mon projet ici.
OriginalL'auteur pcan
Vous pouvez essayer moq.ts, mais il dépend de l'objet Proxy
OriginalL'auteur dvabuzyarov