2009-05-07 3 views

risposta

35

È possibile semplicemente creare un database SQLite in memoria e associare la sessione a tale.

Esempio:


from db import session # probably a contextbound sessionmaker 
from db import model 

from sqlalchemy import create_engine 

def setup(): 
    engine = create_engine('sqlite:///:memory:') 
    session.configure(bind=engine) 
    # You probably need to create some tables and 
    # load some test data, do so here. 

    # To create tables, you typically do: 
    model.metadata.create_all(engine) 

def teardown(): 
    session.remove() 


def test_something(): 
    instances = session.query(model.SomeObj).all() 
    eq_(0, len(instances)) 
    session.add(model.SomeObj()) 
    session.flush() 
    # ... 
+1

Ottima risposta! Penso che sia necessario chiamare 'create_all' sull'oggetto MetaData per creare effettivamente tabelle. Anche se vengono utilizzati tipi di dati specifici di db-vendor, alcuni DDL potrebbero non essere eseguiti. – van

+0

Buoni punti. Ho aggiornato l'esempio per mostrare una chiamata a create_all. – codeape

+5

Questa è una risposta orribile se SQLLite non è il tuo database di produzione. Non testare mai con un database diverso da quello che si sta utilizzando in produzione. Avranno molte differenze e ti stai preparando per un disastro. –

2

Partenza il progetto fixture. Abbiamo usato il naso per testarlo ed è anche un modo per definire in modo dichiarativo i dati da testare, ci saranno alcuni esempi completi da usare lì!

Vedere anche fixture documentation.