Dipende davvero da cosa è Bar
. Se è qualcosa di semplice, il tuo metodo Foo
è già testabile, devi solo specificare le tue aspettative e invocarlo staticamente, ad esempio:
Assert.IsTrue( FooContainer.Foo() );
Ma se Bar
incapsula, ad esempio, il livello di accesso al database, non puoi testare Foo
senza un vero database, motivo per cui (grazie a @iskoli), i metodi statici sono morti per testabilità . Oppure, con le parole di Michael Feathers, " non nascondere un TUF in un TUC " (TUF è sinonimo di funzione di prova-ostile, TUC sta per un costrutto ostile al test). Se Bar
è infatti test-unfriendly , quindi scusa, non funziona bene senza rendere Foo
un metodo di istanza. Dovresti prima riprogettare il tuo codice:
public class FooContainer {
public bool Foo() {
var bar = new Bar();
//...
}
}
Quando Foo
non è più statico, puoi invocarlo su un'istanza di FooContainer
:
var container = new FooContainer();
Assert.IsTrue( container.Foo() );
Il prossimo passo è estrarre un'interfaccia da Bar
(chiamiamola IBar
) e inserirla in FooContainer
:
public class FooContainer {
private readonly IBar m_bar;
public FooContainer( IBar bar ) { m_bar = bar; }
public bool Foo() {
// don't create another Bar, use m_bar
}
}
Ora puoi simulare / stub IBar
con il tuo preferito framework di isolamento e verifica il tuo codice FooContainer
in isolamento dalle sue dipendenze.