Ho notato alcuni codici duplicati in una base di codice su cui sto lavorando che ha aggiunto un nome file a un percorso di directory, quindi ho deciso di rifattorizzarlo nel suo metodo. L'applicazione su cui sto lavorando non è ancora ben testata; Ho appena installato i primi test di unità su di esso due giorni fa, quindi sono molto preoccupato di ottenere quanto più codice possibile da testare quando lo tocco.
Così ho iniziato a scrivere un test unitario come questo (pseudocodice):
Directory directory("a")
Expect(directory.prependPathToFilename("b")).toBeEqualTo("a/b")
Tuttavia, ho poi ricordato che l'applicazione è multipiattaforma. Così ho pensato a questo:
Directory directory("a")
String separator = "/" if (platform is *nix) else "\"
Expect(directory.prependPathToFilename("b")).toBeEqualTo("a" + separator + "b")
Ma mi sono ricordato che Roy Osherove dice nella sezione 7.1.2 ("Evitare la logica nei test") di The Art of Unit Testing (178):
If you have any of the following inside a test meethod, your test contains logic that should not be there:
switch
,if
, orelse
statements
foreach
,for
orwhile
loopsA test that contains logic is usually testing more than one thing at a time, which isn't recommended, becauset he test is less readable and more fragile. But test logic also adds complexity that may contain a hidden bug.
Ora, non sembra che in questo caso sto testando più di una cosa alla volta. Questo sarebbe un caso di un blocco logico accettabile in un test? Esiste uno schema per testare in modo pulito comportamenti / risultati che attesi siano diversi su piattaforme diverse?