2013-05-14 26 views
5

Ho una piccola app in Flask che voglio accompagnare con i test. Ho usato i test di Django prima e sto solo facendo i conti con la funzionalità di livello inferiore in Flask.Test Suite in pallone con MongoEngine

miei test attualmente simile a questa:

import unittest 
from config import app 
from mongoengine import connect 
from my_app.models import User 

class TestCase(unittest.TestCase): 

    def setUp(self): 
     app.config['TESTING'] = True 
     app.config["MONGODB_DB"] = 'xxx' 
     connect(
      'xxx', 
      username='heroku', 
      password='xxx', 
      host='xxx', 
      port=xxx 
     ) 
     self.app = app.test_client() 

    def tearDown(self): 
     pass 

    def test_create_user(self): 
     u = User(username='john', email='[email protected]') 
     u.save() 

So che questo è sbagliato, perché i passi di prova, ma ho aggiunto una voce nel database. Come dovrei testare la creazione di un utente senza inquinare il database? Avevo dato per scontato che lo app.config['TESTING'] avesse un certo significato qui.

Qualsiasi aiuto molto apprezzato.

risposta

7

Ci sono due approcci che conosco:

1. test separato Database

Questo è qualcosa che Django fa automaticamente per unit testing. Semplicemente usa un database separato per testare che cancella prima e dopo ogni esecuzione di test. Potresti implementare qualcosa di simile manualmente.

2. Usare Mocking per evitare realtà usando il database

Questo è il metodo più preferito per la maggior parte delle situazioni. Usi il mocking per simulare varie funzioni in modo che i test non creino/modificino/cancellino effettivamente le informazioni in un vero database. Questo è meglio per molteplici ragioni, in particolare per le prestazioni/velocità dei test delle unità.

+1

Grande. Stavo arrivando a questa conclusione: sono stato abituato a Djago a fornire la "magia". Ci sono buone librerie di beffe là fuori per Flask? –

+0

Puoi usare qualsiasi libreria fittizia di Python (per esempio 'mock'), ma per trovare meglio il database qualche pacchetto che già sta deridendo' mongoengine' o 'pymongo'. Guarda un'altra domanda: http://stackoverflow.com/a/16017141/880326. – tbicr

+2

Prendere in giro una soluzione migliore? Stai scherzando. Mocking è fantastico per evitare chiamate API, accelerare i test (test a livello singolo) e tonnellate di roba, ma usarlo per evitare di creare cose nel DB è come provare a guidare un'auto senza sederci sopra. No. Soluzione 1, quella giusta in questo caso. –