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?