5

Supponiamo che stiate scrivendo una funzione per verificare se una pagina è stata raggiunta dall'URL appropriato. La pagina ha uno stub "canonico" - ad esempio, mentre una pagina può essere raggiunta su stackoverflow.com/questions/123, preferiremmo (per ragioni SEO) reindirizzare a stackoverflow.com/questions/123/how-do -i-move-the-turtle-in-logo - e il reindirizzamento effettivo è contenuto in modo sicuro nel suo metodo (ad esempio redirectPage ($ url)), ma come testare correttamente la funzione che lo chiama?Le funzioni di test unitario con effetti collaterali?

Per esempio, prendete la seguente funzione:

function checkStub($questionId, $baseUrl, $stub) { 
    canonicalStub = model->getStub($questionId); 
    if ($stub != $canonicalStub) { 
    redirectPage($baseUrl . $canonicalStub); 
    } 
} 

Se si dovesse unit test la funzione checkStub(), non sarebbe il reindirizzamento ottenere nel modo?

Questo fa parte di un problema più ampio in cui alcune funzioni sembrano diventare troppo grandi e lasciano il regno dei test delle unità e nel mondo dei test di integrazione. La mia mente pensa immediatamente a router e controller come ad avere questo tipo di problemi, in quanto testarli porta necessariamente alla generazione di pagine piuttosto che essere limitati solo alla propria funzione.

Ho appena fallito al test unitario?

+0

Rallentare ... e ripensare a quello che stai veramente cercando di testare qui ... Se si rimuove il reindirizzamento, il checkStub il metodo non fa molto quindi non sono sicuro del vero test qui. Solitamente testate gli effetti collaterali causati da una tale funzione. – Gishu

+0

@gishu: si, è un esempio incredibilmente errato generato da un problema precedente che ho risolto. Il problema è stato risolto, ma l'esempio (reindirizzamento) è rimasto bloccato nella mia testa.Concentrati sulla fine della domanda - router, controllori - come la vera carne della domanda. Come faccio a testare funzioni la cui attenzione è in gran parte "creare cose" ma che devono ancora essere testate a causa del loro ordine e della loro logica interna. Ho intenzione di svenire ora e probabilmente modificherò questa domanda al mattino. Spero che tu possa vedere il mio intento ora (potrebbe aiutare a sapere che sono nuovo di zecca per il collaudo unitario). – AgentConundrum

+0

Hai appena detto che stai mescolando la logica con la creazione dell'oggetto, il che rende difficile il test delle unità. Puoi dividere queste due preoccupazioni? Se è così, scrivere i test unitari sarà piuttosto banale. – strager

risposta

0

Sembra che tu abbia appena un altro test case. È necessario verificare che lo stub sia identificato correttamente come uno stub con test sia positivi che negativi e che sia necessario verificare che la pagina verso cui si viene reindirizzati sia corretta.

Oppure ho totalmente frainteso la domanda?

+2

puoi metterti in discussione e correggere i tuoi errori di battitura? – strager

1

Tu dici ...

Questo fa parte di un problema più ampio in cui alcune funzioni sembrano ottenere troppo grande e lasciare il regno di unit testing e nel mondo dei test di integrazione

Penso che questo sia il motivo per cui il test unitario è (1) difficile e (2) porta al codice che non si sgretola sotto il suo stesso peso. Devi essere meticoloso per rompere tutte le tue dipendenze o finire con test unitari == test di integrazione.

Nell'esempio si inserisce un redirector come dipendenza. Usi un finto, doppio o spia. Quindi esegui i test mentre @atk si espande. A volte non ne vale la pena. Più spesso ti costringe a scrivere codice migliore. Ed è difficile fare a meno di un container IOC.

1

Questa è una vecchia domanda, ma penso che questa risposta sia pertinente. @Rob afferma che si dovrebbe iniettare un redirector come dipendenza - e sicuramente, questo funziona. Tuttavia, il tuo problema è che non hai una buona separazione delle preoccupazioni.

È necessario rendere le proprie funzioni quanto più possibile atomiche e quindi comporre funzionalità più grandi utilizzando le funzioni granulari che sono state create. È stato scritto da:

function checkStub($questionId, $baseUrl, $stub) { 
    canonicalStub = model->getStub($questionId); 
    if ($stub != $canonicalStub) { 
    redirectPage($baseUrl . $canonicalStub); 
    } 
} 

mi piacerebbe scrivere questo:

function checkStubEquality($stub1, $stub2) { 
    return $stub1 == $stub2; 
    } 

    canonicalStub = model->getStub($questionId); 
    if (!checkStubEquality(canonicalStub, $stub)) redirectPage($baseUrl . $canonicalStub); 
Problemi correlati