Comment pensez-vous vous moquez de MySQL (sans ORM) dans Node.js?
Je suis en utilisant Node.js
avec felixge de node-mysql
client. Je ne suis pas à l'aide d'un ORM.
Je suis en essais avec des Vœux et que vous voulez être en mesure de se moquer de ma base de données, éventuellement à l'aide de Sinon. Depuis je n'ai pas vraiment un DAL en soi (à part node-mysql
), je ne suis pas vraiment sûr de savoir comment aller à ce sujet. Mes modèles sont pour la plupart simples CRUD avec beaucoup de getters.
Aucune idée sur la façon d'accomplir cette?
- Pouvez-vous me donner plus de détails? Par exemple coller du code et de montrer peut-être un pseudo de ce que vous souhaitez réaliser? Je voudrais de l'aide.
- Honnêtement, je ne sais même pas vraiment par où commencer. Vraiment Idéalement, j'aimerais voir quelqu'un d'autre modèle de classe et de leurs associés se moque/tests.
- Toute personne utilisant la Blague avec le même problème?
Vous devez vous connecter pour publier un commentaire.
Avec sinon, vous pouvez mettre une maquette ou tampon autour de l'ensemble du module. Par exemple, supposons que la
mysql
module a une fonctionquery
:queryString
,queryParams
sont l'entrée que vous attendez.rows
est la sortie que vous attendez.Lors de votre classe de test maintenant besoin de mysql et appelle la
query
méthode, il sera intercepté et vérifié par sinon.Dans votre test d'attente section, vous devez avoir:
et dans votre teardown vous devez restaurer la base de données mysql à une fonctionnalité normale:
Il peut être une bonne idée de faire abstraction de votre base de données dans sa propre classe qui utilise mysql. Ensuite, vous pouvez passer de la catégorie de l'instance pour votre modèle de constructeurs au lieu de les charger à l'aide de require().
Avec cette configuration, vous pouvez passer à un simulacre d'instance db à vos modèles à l'intérieur de votre unité de fichiers de test.
Voici un petit exemple:
Je ne suis pas entièrement familier avec node.js mais, dans une programmation traditionnelle de sens, de réaliser des tests comme ça, vous auriez besoin de faire abstraction de la méthode d'accès aux données. Ne pourrait-on pas créer un DAL de classe comme:
Aujourd'hui dans le cadre d'un test, patch votre getAllBooks classe lors de l'initialisation comme:
Lorsque le code de test est appelé, getAllBooks sera remplacé par une version qui retourne se moquer de données au lieu de les appeler mysql. Encore une fois, c'est une idée que je ne suis pas entièrement familier avec node.js
J'ai fini par partir avec @kgilpin de réponse et à la fin quelque chose comme ça pour tester Mysql dans une AWS Lambda:
Je ne voulais pas de réelles connexions de base de données j'ai donc manuellement moqué de tous les mysql réponses.
Ajouté par une autre fonction à
.returns
vous pouvez vous moquer de n'importe quelle méthode hors decreateConnection
.Vous pouvez vous moquer de sortir des dépendances externes à l'aide de horaa
Et je crois aussi felixge du nœud bac à sable-module peut aussi faire quelque chose de similaire.
Donc à l'aide d'kgilpin le même contexte, dans horaa il ressemblerait à quelque chose comme:
Depuis l'utilisation du pilote mysql nécessite d'abord de créer une connexion, et de l'utilisation des api de retour de la connexion du contrôleur - vous besoin d'une approche en deux étapes.
Il y a deux façons de le faire.
cogner la createConnection, et le retour d'un écrasé de connexion
Lors de l'installation:
Au Cours De Démontage:
Noter qu'ici, la
query
méthode est moqué sur une instance, et n'a aucune incidence sur le sous-jacent technique, de sorte que seules lescreateConnection
doit être restauré.cogner la .méthode de requête sur la connexion prototype
Cette technique est un peu plus délicat, car le
mysql
pilote n'expose pas officiellement, c'est la connexion pour l'importation. (eh bien, vous pouvez simplement importer juste le module de mise en œuvre de la connexion, mais il n'y a aucune garantie que le refactoring ne bougera pas de là).Afin d'obtenir une référence au prototype - j'ai l'habitude de créer une connexion et traverse le constructeur de prototype de la chaîne:
J'ai l'habitude de le faire en une seule ligne, mais je vais le décomposer à des mesures et de l'expliquer ici:
Lors de l'installation:
Au Cours De Démontage
Noter que nous n'avons pas se moquer de la
createConnection
méthode ici. Tous les paramètres des validations arrivera encore (ce qui, je veux qu'ils se produisent. J'aspire à travailler avec un maximum d'authentiques pièces - donc se moquer de l'absolu minimum requis pour obtenir un test rapide). Toutefois - l'query
est moqué sur le prototype, et qui doit être restauré.Notez également que si vous travaillez chirurgicalement, le
verify
sera sur la moqué de méthode, et non sur la mockTarget.Voici une bonne ressource à ce sujet: http://devdocs.io/sinon~6-stubs/