Nel capitolo 3 del suo libro The Art of Unit Testing: con esempi in C # , Roy Osherove descrive il concetto di test di modifica dello stato di un sistema.
Il codice di esempio sotto test che usa è simile a questo:
public class LogAnalyzer
{
public bool WasLastFileNameValid { get; set; }
public bool IsValidLogFileName(string filename)
{
WasLastFileNameValid = false;
if (string.IsNullOrEmpty(filename))
{
throw new ArgumentException("filename has to be provided");
}
if (filename.EndsWith(".SLF", StringComparison.InvariantCultureIgnoreCase))
{
WasLastFileNameValid = true;
return true;
}
return false;
}
}
e vogliamo testare lo stato della proprietà WasLastFileNameValid
.
A tal fine, l'autore utilizza il seguente test:
[Test]
public void IsValidFileName_WhenCalled_ChangesWasLastFileNameValid()
{
LogAnalyzer la = MakeAnalyzer();
la.IsValidLogFileName("badname.foo");
Assert.False(la.WasLastFileNameValid);
}
Tuttavia, vedo i seguenti problemi con questo test:
- La parte "risultato" del nome del test è
ChangesWasLastFileNameValid
, ma il test in realtà non controlla se il valore della proprietà cambia; potrebbe essere statofalse
anche prima della chiamata aIsValidLogFileName
. - Il test verifica solo il caso in cui l'ultima chiamata era un nome file non valido.
Vorrei usare il seguente test (usando xunit.net
)
[Theory]
[InlineData(true, "fileWithValidExtension.SLF", true)]
[InlineData(true, "fileWithBadExtension.FOO", false)]
[InlineData(false, "fileWithValidExtension.SLF", true)]
[InlineData(false, "fileWithBadExtension.FOO", false)]
public void IsValidLogFileName_WhenCalled_ChangesWasLastFileNameValid(
bool preState, string filename, bool postState)
{
LogAnalyzer analyzer = new LogAnalyzer();
analyzer.WasLastFileNameValid = preState;
analyzer.IsValidLogFileName(filename);
Assert.Equal<bool>(postState, analyzer.WasLastFileNameValid);
}
Qui provo se il valore cambia e collaudo anche tutti gli scenari. È un test migliore?