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?
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
@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
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