2016-07-02 22 views
0
def fixture(self, name): 
     ... 
     user = User(123) 
     user.first_name = 'Houman' 
     db.session.add(user) 
     db.session.commit() 
     return news_list, user 

def test_update(self): 
     with app.app_context(): 
      news_list, user = self.fixture('/topnews_id.json') 
      user.first_name = 'John' 
      user2 = db.session.query(User).get(user.id) 

benutzer2 zeigt den Vornamen == ‚John‘ zu begehen, die keinen Sinn machen, da ich nicht ein db.session.commit() Ich erwarte user2.first_name seine ‚Houman‘ getan habe.SQLAlchemy scheint innerhalb Unittests

Ich glaube, ich muss den app_context löschen, bevor Sie versuchen, den Benutzer abzurufen. Ist das richtig? Wie kann dies bitte erreicht werden?

Antwort

2

Dies wird erwartet, da SQLAlchemy jeden im Speicher gespeicherten Wert zurückgibt. SQLAlchemy ist insofern intelligent, als Sie nicht jedes Mal, wenn Sie etwas tun, ein Commit an die Datenbank machen.

+0

Dieses Verhalten beeinträchtigt jedoch meinen Komponententest. Wie kann ich es im Komponententest deaktivieren? Mit anderen Worten, wie kann ich den Abruf von db erzwingen, wenn '.get()' aufgerufen wird? – Houman

+1

@Houman Nun, ich würde tatsächlich fragen, warum Sie SQLAlchemy in Ihren Komponententests testen, weil es das ist, was Sie anscheinend tun, machen TBH nicht viel Sinn. Wenn Sie einige Funktionen oder ähnliches in der Einheit testen würden, würde ich die Datenschicht verspotten, anstatt mich auf eine tatsächliche Datenbank zu verlassen. – shackra

+0

Wenn Ihre Unittests Ihre Umgebung nicht reparieren, ändern Sie die Umgebung nicht nur für sie, Sie ändern die Tests an die Umgebung. –