web-dev-qa-db-fra.com

Comment se moquer de mongodb pour python tests unitaires?

J'utilise le module mock pour Python 2.7 pour simuler mes autres fonctions et j'utilise

unittest pour écrire des tests unitaires.

Je me demande si se moquer de MongoDB est différent de l'utilisation de la fonctionnalité de simulation (mock.patch une fonction qui est appelée?) Ou dois-je utiliser un autre package différent à cet effet?

Je ne pense pas vouloir exécuter une instance de test mongodb. Tout ce que je veux, c'est des données de tempo et pouvoir appeler la fonctionnalité pymongo. Je suis juste un peu perdu en pensant à la possibilité d'écrire une maquette pour un module (comme pymongo), ou tout est réalisable par le module mock.

Alors appréciez si vous pourriez fournir un exemple ou un tutoriel à ce sujet.

Code à tester

from pymongo import MongoClient

monog_url = 'mongodb://localhost:27017'
client = MongoClient(monog_url)
db = client.db

class Dao(object):
   def __init__(self):
      pass

   def save(self, user):
      db_doc = {
        'name': user.name,
        'email': user.email
      }
      db.users.save(db_doc)

   def getbyname(self, user):
      db_doc = {
        'name': user.name,
      }
      return db.users.find(db_doc)

Pour tester cela, je n'ai pas vraiment envie d'un mongodb de test opérationnel! Mais aussi, je pense que je ne veux pas me moquer de db.userssave et db.users.find parce que je veux réellement pouvoir récupérer les données que j'ai enregistrées et m'assurer qu'elles sont dans la base de données. Je pense que je dois créer des fixtures par modèles qui sont dans ma mémoire et travailler avec eux. Ai-je simplement besoin d'un outil externe pour le faire?

Je pense à conserver de fausses données comme celle-ci, je ne sais pas comment les traiter correctement.

users = { 
    {'name' : 'Kelly', 'email' : '[email protected]'},
    {'name': 'Sam', 'email': '[email protected]'}
}
16
Mahshid Zeinaly

Je recommande d'utiliser mongomock pour se moquer de mongodb. Il s'agit essentiellement d'un mongodb en mémoire avec une interface pymongo et spécialement conçu à cet effet.

https://github.com/mongomock/mongomock

10
Kris

Vous pouvez également le faire si vous faites simplement quelque chose de simple et que vous n'avez pas vraiment besoin de récupérer par champ.

@mock.patch("pymongo.collection.Collection.find")
def test_name(self, mock_find):
    mock_find.return_value = {'name' : 'Kelly', 'email' : '[email protected]'}
    # rest of test
1
mirthbottle

Vous pouvez certainement vous moquer de PyMongo, mais je recommande de se moquer du serveur MongoDB lui-même. J'ai écrit un émulateur pur-Python pour MongoDB qui peut contrôler complètement, qui répond aux messages du protocole de fil MongoDB comme vous le souhaitez:

http://mockupdb.readthedocs.io/tutorial.html

Voici un exemple d'utilisation de MockupDB avec une application Python:

https://emptysqua.re/blog/test-mongodb-failures-mockupdb/

Cela nécessite une connaissance approfondie du protocole de fil MongoDB, mais c'est une compétence utile à acquérir de toute façon.

1
A. Jesse Jiryu Davis