Sto scrivendo una classe che erediterà un'interfaccia. Il codice client verrà scritto per quell'interfaccia e la classe scritta per supportarlo. L'idea è che in seguito scriverò altre classi per quell'interfaccia e gli oggetti di queste due classi differenti dovrebbero essere completamente intercambiabili. Piuttosto che scrivere una classe di test per quella prima lezione, voglio scriverne una per l'interfaccia.PHPUnit - Scrittura di una classe di test per un'interfaccia e test degli oggetti utilizzando una fabbrica
Il mio piano era scrivere una classe di test che avrebbe preso un oggetto factory per il costruttore (dependency injection) e utilizzare la factory per creare nuove istanze della classe sottoposta a test.
In questo modo, se volessi testare ClassA, potrei passare un oggetto ClassAFactory al costruttore della classe di test e, se volessi testare ClassB, passerei un oggetto ClassBFactory. Entrambe le classi sono progettate per essere intercambiabili e dato che solo i metodi pubblici dovrebbero essere testati, questo sembra l'ideale.
Ma che dire del test del costruttore? Farei meglio a scrivere una classe di test astratta e a impiantare test del costruttore in classi che ereditano la classe di test astratta (diverse classi possono essere istanziate in modo diverso)?
Se ho usato la prima idea, credo che avrei avuto una classe di test per ogni classe in fase di sperimentazione, come:
class ClassATest extends [PHPUnit test case]
{
$myFactory = new ClassAFactory();
$myTest = new ClassTest($myFactory);
$myTest->test1();
$myTest->test2();
//etc.
}
Qual è il modo migliore per andare su questo? Voglio fare un test generale, in modo che quando scrivo nuove classi per implementare l'interfaccia comune, posso semplicemente mettere un oggetto degli stessi test usati per gli altri. Ma visto che le diverse classi avrebbero costruttori diversi, forse scrivere una classe di test astratta ed estenderla per ogni nuovo oggetto sarebbe meglio? Cosa ne pensi?
In questo specifico esempio, le classi rappresenteranno i destinatari di una mailing list. Anche se avranno diversi modi di fare il loro lavoro, prenderanno gli stessi dati da un cliente e restituiranno gli stessi risultati - completamente intercambiabili. Mi sembra che se gli oggetti di classi diverse che usano quell'interfaccia sono intercambiabili all'interno del codice client, dovrebbero essere intercambiabili anche all'interno del codice di test. Quindi quando dico di voler testare l'interfaccia, intendo dire che voglio scrivere un test su quell'interfaccia, per testare una classe che usa quell'interfaccia. Ha senso per te? –
No, non ha ancora senso. Non è così che capisco un'interfaccia per funzionare. Potresti desiderare una classe base astratta piuttosto che un'interfaccia per implementare il codice comune. Non sono sicuro di cosa ci sia di diverso nelle tue lezioni oltre ai dati. – liquorvicar
Diciamo sulla classe, MailChimpRecipient utilizza l'interfaccia MailingListRecipient: il client codificato aggiunge qualcuno alla lista impostando l'indirizzo email e le proprietà del nome dell'oggetto destinatario, quindi chiamando un metodo per aggiungerli. Ora, questo metodo per la classe MailChimp utilizzerà l'API MailChimp per aggiungerli. Dire in futuro, voglio ospitare la mia mailing list o usare un altro provider, potrei cambiare la classe con un'altra classe che usa l'interfaccia MailingListRecipient. Quella classe potrebbe fare qualcosa di completamente diverso per aggiungere il destinatario, ma richiede comunque gli stessi dati. –