Stavo seguendo un libro Art of Unit Testing , Questo libro dice che non devi avere alcuna logica nei tuoi questo riduce la leggibilità del test, o potrei testare troppe cose alla volta. Supponiamo che ci sia un metodo con firma come sotto:
public int DoSomething(int variable1, out string variable2, out float variable3)
{
...
}
Come dovrei testare questo metodo, come devo affermare sul valore restituito, variabile2, variabile3 ???
Metodo di prova del campione che verifica tutti questi tre aspetti:
public void DosSomethingTest(){
//add code for arrange
int expectedvalue=12;
string expectedVariable1="I am expected";
string expectedVariable3=15.9;
string actualVariable1, actualVariable3;
var sut=new Foo();
int actualValue=sut.DoSomething(15, out actualVariable1, out actualVariable3);
//this is where I am testing 3 concerns in one test. Is there a better way?
if(actualValue==expectedvalue){
if(expectedVariable1==actualVariable1){
if(expectedVariable3!=actualVariable3){
Assert.Fail("Unexpected variable2 returned");//pseudo code
}
}
else{
Assert.Fail("Unexpected variable1 returned");//pseudo code
}
}
else{
Assert.Fail("Unexpected Value returned");//pseudo code
}
}
Approccio 2
Metodi di test separati che verificano i problemi separatamente:
public void DosSomething_Passing15_Returns12Test(){
//add code for arrange
int expectedvalue=12;
string expectedVariable1="I am expected";
string expectedVariable3=15.9;
string actualVariable1, actualVariable3;
var sut=new Foo();
int actualValue=sut.DoSomething(15, out actualVariable1, out actualVariable3);
Assert.IsTrue(actualValue, expectedvalue);
}
public void DosSomething_Passing15_ReturnsExpectedVariable1Test(){
//add code for arrange
int expectedvalue=12;
string expectedVariable1="I am expected";
string expectedVariable3=15.9;
string actualVariable1, actualVariable3;
var sut=new Foo();
int actualValue=sut.DoSomething(15, out actualVariable1, out actualVariable3);
Assert.IsTrue(actualVariable1, expectedVariable1);
}
public void DosSomething_Passing15_ReturnsExpectedVariable2Test(){
//add code for arrange
int expectedvalue=12;
string expectedVariable1="I am expected";
string expectedVariable3=15.9;
string actualVariable1, actualVariable3;
var sut=new Foo();
int actualValue=sut.DoSomething(15, out actualVariable1, out actualVariable3);
Assert.IsTrue(actualVariable3, expectedVariable3);
}
L'approccio 2 non aderisce a "I test non dovrebbero testare più di un problema"?
Conclusione
Se la riprogettazione di SUT è possibile:
- In teoria dovrebbe esserci un parametro no out invece di una classe aggregata dovrebbe essere valutato in Assert.
- Se ci sono parametri out non collegati, il metodo SUT dovrebbe essere refactored in più metodi, quindi quei nuovi metodi dovrebbero avere i propri metodi di test e quindi testare solo una preoccupazione.
Se la riprogettazione di SUT non è possibile, come da risposta ci saranno tre Assert