Se moquer de la firebase database dans node.js?

Comment puis-je mocker la firebase database dans mon application node.js, qui dans ce cas utilise mongodb comme backend pour une API REST de blog?

Bien sûr, je pouvais définir la firebase database sur une firebase database de testing spécifique, mais je sauvegardais toujours les données et ne testais pas uniquement mon code, mais aussi la firebase database. Je ne fais donc pas de test unitaire mais de test d’intégration.
Alors, que doit-on faire? Créer des wrappers de firebase database en tant que couche intermédiaire entre l’application et la firebase database et remplacer la DAL lors des tests?

 // app.js var express = require('express'); app = express(), mongo = require('mongoskin'), db = mongo.db('localhost:27017/test?auto_reconnect'); app.get('/posts/:slug', function(req, res){ db.collection('posts').findOne({slug: req.params.slug}, function (err, post) { res.send(JSON.ssortingngify(post), 200); }); }); app.listen(3000); 

 // test.js r = require('requestah')(3000); describe("Does some testing", function() { it("Fetches a blogpost by slug", function(done) { r.get("/posts/aslug", function(res) { expect(res.statusCode).to.equal(200); expect(JSON.parse(res.body)["title"]).to.not.equal(null); return done(); }); }); )); 

Je ne pense pas que le code associé à la firebase database puisse être correctement testé sans le tester avec le logiciel de firebase database. C’est parce que le code que vous testez n’est pas seulement javascript mais aussi la chaîne de requête de la firebase database. Même si dans votre cas les requêtes semblent simples, vous ne pouvez pas compter sur elles pour toujours.

Ainsi, toute couche d’émulation de firebase database implémentera nécessairement la totalité de la firebase database (moins le stockage sur disque, peut-être). D’ici là, vous finissez par faire des tests d’intégration avec l’émulateur de firebase database, même si vous l’appelez les tests unitaires. Un autre inconvénient est que l’émulateur de firebase database peut avoir un ensemble de bogues différent de celui de la firebase database et vous devrez peut-être coder à la fois l’émulateur de firebase database et la firebase database (comme IE vs Firefox vs Chrome, etc. ).

Par conséquent, à mon avis, la seule façon de tester correctement votre code est de l’interfacer avec la firebase database réelle.

Il y a une règle générale en ce qui concerne la moquerie qui est

Ne te moque pas de ce que tu ne possèdes pas.

Si vous voulez simuler la firebase database, cachez-la en créant une couche de service abstraite et simulez cette couche. Ensuite, assurez-vous que l’intégration teste la couche de service réelle.

Personnellement, j’ai cessé d’utiliser des simulacres pour les tester et les utiliser de haut en bas, ce qui m’a aidé à développer le développement vers le bas en intégrant ces couches et en réalisant des tests d’intégration. Utilisés comme outil de test, ils tendent à rendre votre test très fragile et, dans le pire des cas, conduisent à une divergence entre le comportement réel et le comportement simulé.

Je ne suis pas d’accord avec la réponse sélectionnée ou avec d’autres réponses.

Ne serait-ce pas génial si vous pouviez attraper des erreurs engendrées par les changements chaotiques et souvent désordonnés apportés aux schémas de la firebase database et à votre code AVANT de passer à l’assurance qualité? Je parie que la majorité crierait oui oui!

Vous pouvez et devez certainement isoler et tester vos schémas DB. Et vous ne le faites pas sur la base d’un émulateur ou d’une image lourde ou d’une recréation de votre firebase database et de votre machine. Voici à quoi sert SQLite, par exemple. Vous vous moquez de cela en vous basant sur une instance légère en mémoire fonctionnant avec des données statiques qui ne changent pas dans l’instance de mémoire, ce qui signifie que vous testez réellement votre firebase database de manière isolée et que vous pouvez également faire confiance à vos tests. Et évidemment, c’est rapide car il est en mémoire, un squelette, et est supprimé à la fin d’un test.

Donc oui, vous devriez et vous devriez tester le SCHEMA qui est exporté dans une instance en mémoire très légère de tout moteur / exécution de firebase database que vous utilisez, et cela ajoute une très petite quantité de données statiques à votre firebase database isolée.

Vous exportez périodiquement vos vrais schémas à partir de votre vraie firebase database (de manière automatisée) et les importez / mettez à jour dans votre instance de mémoire avant chaque diffusion. Vous saurez instantanément si les dernières modifications apscopes par vos administrateurs DB ou autres Les développeurs qui ont changé le schéma récemment ont brisé tous les tests.

Bien que j’applaudisse aux efforts déployés pour faire de mon mieux pour répondre, je voterais contre la réponse actuelle si je le pouvais, mais je suis nouveau et je n’ai pas encore acquis assez de réputation pour que je puisse encore le faire.

Quant à la personne qui a répondu avec “ne te moque pas de ce que tu ne possèdes pas”. Je pense qu’il voulait dire “ne testez rien de ce que vous ne possédez pas”. Mais vous vous moquez des choses que vous ne possédez pas! Parce que ce sont les choses non testées qui doivent être isolées!

Je prévois de partager le COMMENT avec vous et mettra à jour ce post à un moment ultérieur avec un exemple de code JS réel!

C’est ce que font de nombreuses équipes pilotées par des tests tout le temps. Vous devez juste comprendre comment.

Le but de la moquerie est de sauter la complexité et le code propre aux tests unitaires. Si vous voulez écrire des tests e2e, utilisez la firebase database.

Ecrire du code pour configurer / démonter une firebase database de test pour les tests unitaires est une dette technique et incroyablement insatisfaisante.

Il y a de fausses bibliothèques dans npm:

mongo – https://www.npmjs.com/package/mongomock

mongoose – https://www.npmjs.com/package/mockgoose

Si ceux-ci ne prennent pas en charge les fonctionnalités dont vous avez besoin, alors oui, vous devrez peut-être utiliser le vrai.

Mon approche préférée pour le test de code DB dans toutes les langues est d’accéder à Mongo via une abstraction du référentiel (il y a un exemple ici: http://iainjmitchell.com/blog/?p=884 ). Les implémentations varient en termes de fonctionnalités spécifiques à la firebase database, mais en supprimant tout le code Mongo de votre propre logique, vous êtes en mesure de tester les unités. Remplacez simplement l’implémentation du référentiel Mongo par une version simplifiée, ce qui est sortingvialement simple. Par exemple, stockez simplement des objects dans une simple collection de dictionnaires en mémoire.

Vous obtiendrez les avantages du test unitaire de votre propre code sans dépendance à la firebase database, mais vous devrez toujours effectuer des tests d’intégration avec la firebase database principale car vous ne pourrez probablement jamais émuler les idiosyncras dit ici. Le genre de choses que j’ai trouvé est aussi simple que l’indexation en mode sans échec et sans mode sans échec. Plus précisément, si vous avez un index unique, votre implémentation de mémoire factice pourrait honorer cela dans tous les cas, mais Mongo ne sera pas sans mode sans échec.

Ainsi, bien que vous deviez toujours tester certaines opérations sur la firebase database, vous serez certainement en mesure de tester votre propre logique correctement avec une implémentation de référentiel qui ne sera plus utilisée.

J’ai eu ce dilemme et j’ai choisi de travailler avec une firebase database de test et de la nettoyer chaque fois que le test commence. (comment tout laisser tomber: https://stackoverflow.com/a/25639377/378594 )

Avec NPM, vous pouvez même créer un script de test qui crée le fichier de firebase database et le nettoie ensuite.