Supponendo di avere la seguente (molto semplice) classe
class Foo
{
public:
void setAB(int a, int b) { m_a = a; m_b = b; m_aIsBigger = a > b; }
int getA() const { return m_a; }
int getB() const { return m_b; }
bool isABigger() const { return m_aIsBigger; }
protected:
int m_a;
int m_b;
bool m_aIsBigger;
}
e voglio metterlo sotto test automatizzato (ad esempio, unit test, modulo test). Posso vedere due possibili modi per testare le funzioni:
O posso usare le sue funzioni per testarlo, cioè invocare setAB() e quindi verificare che getA() , getB() e isABigger() restituiscano i valori previsti. Oppure potrei impostare direttamente m_a (ad esempio sottoclassando Foo), quindi richiamare getA() e verificare che il valore sia identico a quello impostato.
Il primo metodo sembra più "organico", poiché usa la funzionalità incorporata della classe ed è indipendente dalla sua implementazione (ad esempio, nel caso mi rendo conto che potrei calcolare "a > b" al volo per isABigger() invece di usare m_aIsBigger ). Tuttavia sembra violare il principio del "test solo una cosa" per i test (anche se separo getA() , getB() e isABigger() nei loro casi di test, non posso testarli separatamente da setAB() ; Prova setAB() senza invocare getA() e getB() )
Se sottoclassi Foo posso testare ciascuna funzione individualmente, ma è un po 'sbagliato manipolare la classe' interna in questo modo, ed è molto più fragile (cambiare isABigger() per calcolare il risultato al volo richiederebbe una modifica in il test, anche se sembra non dovrebbe).
Quindi la domanda è: qual è il modo migliore per impostare un oggetto da testare o è semplicemente una questione di preferenza personale?