Come per deridere gli utenti e le richieste in django

Ho django codice che interagisce con richiesta di oggetti o gli oggetti utente. Per esempio qualcosa di simile:

foo_model_instance = models.get_or_create_foo_from_user(request.user)

Se si dovesse andare prova con il django shell di python o in un modulo unittest, cosa vorresti passare lì? Qui semplicemente un oggetto Utente, ma la necessità di un finto oggetto di richiesta, inoltre, si presenta di frequente.

Per la shell o per unittests:

  • Come si fa beffe di utenti?
  • Come si fa beffe di richieste?
  • “Continui a usare quella parola, ma non credo che significhi che cosa significa, secondo te…” penso che tu intenda “mockup”.
  • Sembra divertente, ma credo che lui ce l’ha a destra. @pax: mi ha Battuto per il punch-line 🙁
  • Io … devo confessare che … nel silenzio della mia stanza … a tarda notte … io … sì, sì! Ho finto di utenti!! Tutti loro! @perrierism: non stiamo prendendo in giro, ci sono solo godendo la vostra meravigliosa scelta di parole.
InformationsquelleAutor Purrell | 2010-01-10

 

5 Replies
  1. 70

    Per la richiesta, vorrei utilizzare RequestFactory incluso con Django.

    from django.test.client import RequestFactory
    rf = RequestFactory()
    get_request = rf.get('/hello/')
    post_request = rf.post('/submit/', {'foo': 'bar'})

    per gli utenti, vorrei utilizzare django.contrib.auth.modelli.Utente @ozan suggerito e magari con fabbrica boy per la velocità (con la fabbrica ragazzo si può scegliere di non salvare nel DB)

    • Questa è sicuramente la risposta giusta, ora che RequestFactory è disponibile. Con il credito a Ozan risposta (che istanziare degli oggetti reali è sufficiente e auspicabile). Non ho usato la Fabbrica Boy, ma se la qualità della Ferrovia Factory Girl sembra che sarebbe una scelta eccellente.
    • La migliore soluzione che ha funzionato per me in un django lo script di migrazione. Tuttavia la versione corrente richiede request.user da impostare. Anche utilizzare questa richiesta come un normale vista è bello avere request.csrf_processing_done = True pronto per la richiesta (per passare il TIPO di controlli)
  2. 48

    Come si fa beffe di utenti?

    Inizializzare un django.contrib.auth.models.User oggetto. l'Utente.oggetti.create_user rende questo facile.

    Come si fa beffe di richieste?

    Inizializzare un django.http.HttpRequest oggetto.

    Naturalmente, ci sono collegamenti a seconda di cosa si vuole fare. Se avete solo bisogno di un oggetto con un user attributo che punti ad un utente, è sufficiente creare qualcosa (qualsiasi cosa) e dare loro un attributo.

    • +1: Mock? Perché finto? Utilizzare la cosa reale.
    • è bene utilizzare la cosa reale, a volte, ma finisce molto lento man mano che il progetto cresce. È bello avere mock test che è possibile eseguire in pochi secondi, piuttosto che un paio di minuti.
    • Forse questo è vero in generale. Ma Django client è veramente veloce. Avete qualche alternativa e alcuni parametri di riferimento per mostrare il risparmio di tempo?
    • solo esperienza con i miei progetti. In alternativa all’utilizzo l’utente incorporata è solo quello di usare qualcosa come il pymox quadro di creare i propri oggetti fittizi con la stessa API, come è stato suggerito in un paio di risposte qui. Utilizzando veri oggetti di richiesta non è un problema di velocità.
    • Hai tutte le metriche che mostra che un finto è in qualche modo più veloce di quanto il built-in client?
    • Non sto dicendo che il client è lento, o sostenendo le simulazioni sono più il client (io parto dal presupposto che per “cliente” si fa riferimento a djangos fittizio web “browser”). Sto dicendo che sono più veloce di accesso a DB (che vale solo per il User parte di questa domanda). Se non pensate che la prende in giro sono più veloci di quelli effettivamente l’accesso al DB, quindi ho il sospetto che in realtà non ho provato e rispetto. Un piccolo progetto, il nostro team è andato dalla suite di test che ha preso 1,5 minuti a < a 5 secondi da quando abbiamo cambiato il codice per creare un mock modelli. Non c’è bisogno di scrivere un punto di riferimento quando il divario è così grande.
    • Il mio vero le richieste hanno .user attributo. Le istanze di django.http.HttpRequest non. Io sono solo l’impostazione richiesta.utente dopo la sua creazione. Non che sembra ragionevole?
    • E potrebbe essere necessario un attributo META e con un paio di set predefiniti: request.META = { 'SERVER_NAME': 'testserver', 'SERVER_PORT': '80', 'SERVER_PROTOCOL': 'HTTP/1.1', }

  3. 7

    Si può arrotolare prende in giro, come Anurag Uniyal ha suggerito, oppure è possibile utilizzare un beffardo quadro.

    In risposta a chi dice che si può semplicemente creare un utente normale come si sarebbe comunque in Django… vorrei suggerire questo sconfigge il punto di test di unità. Una unità di test non dovrebbe toccare il database, ma con la creazione di un utente, hai modificato il database, quindi perchè dovremmo ingannarci.

    • Come Daniel accennato, il test runner crea e poi distrugge un database di test per voi, in modo da non dovrete preoccuparvi di questo.
    • Tranne se si utilizza il database, quindi non è una unità di test più. Potrebbe essere ancora perfettamente valido test di integrazione, ma non è un test di unità.
    • Il problema è che la creazione e la distruzione di una banca dati richiede tempo. Voglio, infine, eseguire migliaia di test in un batter d’occhio, ogni volta che faccio una modifica. Non voglio stand up di un database e di un’istanza dell’applicazione per eseguire il test.
    • Concordato, è molto utile avere le prove che non ha colpito un DB. Anche se si utilizza un database SQLite è ancora wwaaaay più lento di test che utilizzano le simulazioni.
  4. 5

    Non c’è bisogno di deridere gli Utenti, come si può semplicemente creare uno all’interno del vostro test – il database è distrutta dopo il test è finito.

    Per deridere le richieste, utilizzare questo snippet da Simon Willison.

    • Mentre sono d’accordo di solito si può ottenere via con la creazione di Utenti per le prove, ci sono volte che non si desidera o si fa così è al di fuori della portata del test. Se sto test che viene negato l’autorizzazione se un helper metodo restituisce False – è sbagliato per me, per la coppia che per il database. Che metodo di supporto esiste PERCHÉ non voglio conoscere il database di rappresentazione.

Lascia un commento