2013-02-20 3 views
9

Ich verwende Django 1.4's LiveServerTestCase für Selenium Tests und habe Probleme mit der setUpClass Klassenmethode. Soweit ich weiß, wird MembershipTests.setUpClass einmal ausgeführt, bevor die Komponententests ausgeführt werden.Django LiveServerTestCase: Benutzer erstellt in in setUpClass-Methode nicht in test_method?

Ich habe Code, um einen Benutzer in die Datenbank in MembershipTests.setUpClass hinzufügen, aber wenn ich den MembershipTests.test_signup-Test ausführen, wurde kein Benutzer der Test-Datenbank hinzugefügt. Was mache ich falsch? Ich erwarte, dass der Benutzer, den ich in setUpClass erstellt habe, über alle Komponententests verfügbar sein würde.

Wenn ich die Benutzererstellung Code in MembershipTests.setUp setzen und laufe MembershipTests.test_signup ich den Benutzer sehen kann, aber nicht will, diesen Lauf vor jedem Gerät zu testen, wie setUp ist. Wie Sie sehen können, verwende ich eine benutzerdefinierte LiveServerTestCase-Klasse, um grundlegende Funktionalität für alle meine Tests hinzuzufügen (test_utils.CustomLiveTestCase). Ich vermute, das hat etwas mit meinem Problem zu tun.

Vielen Dank im Voraus.

test_utils.py:

from selenium.webdriver.firefox.webdriver import WebDriver 
from django.test import LiveServerTestCase 

class CustomLiveTestCase(LiveServerTestCase): 

    @classmethod 
    def setUpClass(cls): 
     cls.wd = WebDriver() 
     super(CustomLiveTestCase, cls).setUpClass() 

    @classmethod 
    def tearDownClass(cls): 
     cls.wd.quit() 
     super(CustomLiveTestCase, cls).tearDownClass() 

tests.py:

from django.contrib.auth.models import User 
from django.test.utils import override_settings 
from test_utils import CustomLiveTestCase 
from test_constants import * 

@override_settings(STRIPE_SECRET_KEY='xxx', STRIPE_PUBLISHABLE_KEY='xxx') 
class MembershipTests(CustomLiveTestCase): 

    fixtures = [ 
     'account_extras/fixtures/test_socialapp_data.json', 
     'membership/fixtures/basic/plan.json', 
    ] 

    def setUp(self): 
     pass 

    @classmethod 
    def setUpClass(cls): 
     super(MembershipTests, cls).setUpClass() 
     user = User.objects.create_user(
      TEST_USER_USERNAME, 
      TEST_USER_EMAIL, 
      TEST_USER_PASSWORD 
     ) 

    def test_signup(self): 
     print "users: ", User.objects.all() 

Antwort

9

Da Sie LiveServerTestCase verwenden, ist es fast identisch mit TransactionTestCase, das Datenbank (truncates tables) für jeden ausgeführten Testfall erstellt und zerstört.

So können Sie wirklich keine globalen Daten mit LiveServerTestCase tun.

+0

Irgendwelche Ideen, wie könnte ich einen Benutzer erstellen und dann mit LiveServerTestCase einloggen? Erstellen des Kontos in Setup mit SQLite-Datenbank in: Arbeitsspeicher: funktioniert nicht, auch wenn ich manuell festlege. – dotz

12

Die Datenbank wird abgerissen und an jeder Testmethode neu geladen wird, nicht auf der Testklasse. So wird Ihr Benutzer jedes Mal verloren gehen. Tun Sie das in setUp nicht setUpClass.

+0

Vielen Dank für Ihre Antwort. Bedeutet das, dass [diese Antwort] (http://stackoverflow.com/a/14038336/378638) falsch ist oder missverstehe ich es? Ist es nicht möglich, Testdatensätze an einem Ort zu erstellen, um sie für alle Testmethoden in einer Testklasse zu verwenden? Ich möchte den gleichen Benutzerdatensatz für alle Testmethoden verwenden, und "setUp" erstellt es vor jedem neu. –

Verwandte Themen