Sto costruendo un generatore di Sudoku. Ho una classe di bordo con un numero di metodi:
public class Board {
public Board() { /* Creates an empty board */ }
public bool ValidateRow(int row) { /* Checks for errors in row */ }
public bool ValidateColumn(int column) { /* Checks for errors in column */ }
...
}
Sto seguendo TDD e, come tale, ho una suite completa di test per tutti questi metodi. Vorrei aggiungere due nuovi metodi a questa classe:
public static Board GenerateFilled() { /* Creates a solved board /* }
public bool ValidateBoard() { /* Checks for any error on the board /* }
Sono alle prese con come scrivere i miei test per questi metodi. Il mio primo pensiero fu:
[TestMethod]
public void GenerateFilled_GeneratesAValidSolvedBoard() {
var board = Board.GenerateFilled();
Assert.IsTrue(board.ValidateBoard());
}
ma mi sono reso conto che ho scritto lo stesso test per ValidateBoard:
[TestMethod]
public void ValidateBoard_NoErrors_ReturnsTrue() {
var board = Board.GenerateFilled();
Assert.IsTrue(board.ValidateBoard());
}
Questo test si basa su GenerateFilled e ValidateBoard che funzionano correttamente, sebbene il metodo in prova cambi. Ho trovato i seguenti modi per evitare questo problema:
- Duplica la logica del metodo non sottoposto a test nel test. Usa quella logica per convalidare il mio metodo sotto test invece di chiamare l'altro metodo.
- Lascia il test GenerateFilled così com'è e utilizza i dati di esempio codificati per testare ValidateBoard invece di chiamare GenerateFilled.
Non sono un fan dell'opzione 1 perché renderà noiosi i test accurati se cambiano piccole modifiche alla logica nei metodi duplicati.
Non mi piace l'opzione 2, anche se si basa sul fatto che il mio caso di dati di esempio è generale di tutti i casi, che è meno probabile che sia vero più grande è il set di dati.
Suppongo che nel peggiore dei casi ciò causi solo errori in entrambi i metodi, causando il fallimento di entrambi i test, ma è un po 'un odore. Qualcuno si è imbattuto in uno scenario simile e ha trovato una soluzione migliore rispetto ai precedenti?