Fammi fare un semplice esempio di parcheggio.
Un parcheggiatore può gestire diversi parcheggi, e quando arriva una macchina parcheggia la macchina in un parcheggio e può anche aiutare a parcheggiare la macchina.
Quindi, fondamentalmente nella mia mente, ci sarà una classe ParkingBoy
come questa:
class ParkingBoy {
public ParkingBoy(List<ParkingLot> parkingLots) {}
public Ticket park(Car car) {}
public Car unpark(Ticket ticket) {}
}
Ma nella pratica di TDD, progettiamo l'API dal punto di vista dell'utente e non presumiamo quale sia la classe effettiva e quali metodi ha. Lascia che siano i test a guidarli.
Quindi ho diviso il requisito in diverse piccole attività:
1. A parking boy can manage parking lots
2. A parking boy can park a car to any avaiable parking lot, and return a ticket
3. A parking boy can unpark the car for a ticket
Quando si esegue la prima attività, il mio test è:
class ParkingBoySpec {
@Test public void should_manage_parking_lots() {
List<ParkingLot> parkingLots = list(parkingLot1, parkingLot2);
ParkingBoy boy = new ParkingBoy(parkingLots);
assertThat(boy.getParkingLots()).containsExactly(pakrkingLot1, parkingLot2);
}
}
Ma il mio amico ha domande sul metodo getParkingLots
.
A suo parere, questo metodo viene usato solo per l'asserzione del test e non verrà utilizzato in nessuna parte dell'implementazione, quindi non dovremmo fornirlo. E anche, in realtà non ci importa dei parcheggi gestiti dal ragazzo, quello a cui teniamo è che può parcheggiare e parcheggiare la macchina. Quindi dovremmo rimuovere la prima attività e iniziare dall'attività 2 ( park
).
La mia opinione è:
- Poiché scriviamo test prima dell'implementazione in TDD, in realtà non sappiamo se verrà utilizzato
getParkingLots
nell'implementazione successiva. - Sebbene lo scopo principale del parking boy sia di
park
eunpark
di un'auto, ma voglio iniziare da una semplice attività - Il test è l '"utente" del codice, quindi quando il test pensa se c'è un
getParkingLots
, è un buon motivo per fornire ungetParkingLots
inParkingBoy
Come pensi questa domanda?