Ho scritto una classe che gestisce i destinatari su una lista MailChimp, chiamata MailChimpRecipient. Utilizza la classe MCAPI, che è un wrapper API di terze parti.
link http://apidocs.mailchimp.com/api/downloads/
Ho passato l'oggetto MCAPI al costruttore dell'oggetto MailChimpRecipient, quindi ho scritto test unitari usando PHPUnit per testare tutta la logica della mia classe (non sto testando la classe MCAPI). Ho il 100% di copertura del codice e tutti i test passano. Questo viene fatto simulando e stubando l'oggetto MCAPI.
Il mio prossimo passo è stato scrivere un test di integrazione, anche usando PHPUnit, dove avrei costruito il dispositivo MailChimpRecipient utilizzando un vero oggetto MCAPI, configurato per usare una vera lista MailChimp.
Ho scritto quello che penso sia un test di integrazione, che fondamentalmente esegue nuovamente i test dell'interfaccia pubblica dell'oggetto, come:
public function testAddedRecipientCanBeFound()
{
$emailAddress = '[email protected]';
$forename = 'Fred';
$surname = 'Smith';
// First, delete the email address if it is already on the list
$oldRecipient = $this->createRecipient();
if($oldRecipient->find($emailAddress))
{
$oldRecipient->delete();
}
unset($oldRecipient);
// Add the recipient using the test data
$newRecipient = $this->createRecipient();
$newRecipient->setForename($forename);
$newRecipient->setSurname($surname);
$newRecipient->setEmailAddress($emailAddress);
$newRecipient->add();
unset($newRecipient);
// Assert that the recipient can be found using the same email address
$this->assertTrue($this->_recipient->find($emailAddress));
}
Il test di "integrazione" non verifica nessuno dei componenti interni della classe, ma fa in modo che, dato un vero oggetto MCAPI, si comporti come pubblicizzato.
È corretto? È questo il modo migliore per eseguire un test di interazione? Dopo tutto, gli interni sono stati testati con un test unitario. Ho ragione nel pensare che il test di integrazione sia lì per testare che funzioni davvero, secondo il modo in cui viene pubblicizzato il suo comportamento?
Per fare un ulteriore passo avanti, la classe MailChimpRecipient implementa un'interfaccia, che sarà implementata anche da altre classi. L'idea è di usare una fabbrica per passare diversi tipi di oggetti destinatari della mailing list al mio codice, che fanno tutti la stessa cosa, anche se si usano diversi provider di mailing list. Dal momento che i miei test di integrazione testano l'interfaccia, che ne dici di usarla per tutte le classi che implementano l'interfaccia? Quindi, in futuro, se progetto una nuova classe da utilizzare in modo intercambiabile, posso eseguire lo stesso test di integrazione prima di inserirla in un progetto.
Suona ragionevole? I test unitari testano le parti interne di un oggetto, i test di integrazione assicurano che si comporti come pubblicizzato?