C1: Guia TDD
- Implementa la composició d'temes dins del AmalgamaOnline (o a una classe intermitja)
-
Fes fallar i passa el test testLlistaTemes_ambUnTema Com a primera versió
no cal que creeu la classe Tema podeu guardar un string.
-
Fes fallar i passa el test testLlistaTemes_ambDosTemes
De moment podeu fer l'atribut de tipus: typedef std::list<std::string> Temes;
- Relacionant obres i temes:
-
Fes fallar i passa el test testAssociaTemaAObra_ambTemaInexistent
Us caldrà crear una exepció nova. Si no ho heu fet encara, extreieu totes les classes
exepció a un únic header.
- Afronteu el testAssociaTemaAObra_obraAmbDosTemes serà una mica llarg de passar-lo. Penseu què cal implementar.
Per associar temes a les obres, caldrà buscar una obra d'un autor. I a més caldrà implementar una associació d'obra a temes.
- Creem la classe Tema que reb un el nom al constructor
i el podem agafar amb un getter. Desenvolupem els mètodes amb tests unitaris TestsTema.
- Refactoring: Substituim la llista d'strings per objectes Tema.
-
Testegeu i creeu el mètode associaTema(Tema & estil)
de la classe Obra.
Per comprovar que l'associació funciona podem afegir un llistaTemes a Obra.
Cal provar l'associació amb 0, 1 i 2 elements.
-
Testegeu i creeu un mètode cercaObra(idObra) dins la classe Autor
(cas exitós i de fallada)
- Ara, el testAssociaTemaAObra_obraAmbDosTemes ha de ser relativament fàcil.
- Si heu implementat la cerca de l'objecte Tema dins associaTemaAObra, us caldrà fer un refactoring:
extreieu el mètode cercaTema(idTema)
- Composició d'usuaris i subscrits a temes:
- Fes fallar i passa el test llistaUsuaris_ambUnUsuari
Abans, caldrà testejar i crear la classe Usuari amb un constructor amb string.
Per passar aquest test, amb un atribut simple a AmalgamaOnline n'hi ha prou.
- Fes fallar i passa el test llistaUsuaris_ambDosUsuaris
Ara sí necessitarem una llista
- Afronta el testLlistaSubscritsATema_ambUnUsuari
Primer caldrà testejar/crear un mètode subscriu(Usuari & usuari) a la classe
Tema i testejar/crear un mètode std::string llistaSubscrits()
també dins Tema
Els tests testLlistaSubscritsATema_ambDosUsuaris,
testLlistaSubscritsATema_ambUsuariInexistent
testLlistaSubscritsATema_ambTemaInexistent ja són força directes.
- Ara afrontem els últims tests: testAssociaTemaAObra_notificaUsuariSubscritATema i
testAssociaTemaAObra_notificaDosUsuarisSubscritADosTemes
. El que fan aquests tests és comprovar que quan afegim una obra al negoci
i li afegim temes, tots els usuaris subscrits a aquests temes
són notificats via mail.
En quin moment enviarem la notificació de que hi ha una obra nova als subscrits a un tema?
Una opció seria fer-ho al creaNovaObra, però això no funciona perquè en el moment de crear l'obra no la tenim associada als temes. Per tant caldrà fer-ho al associaTemaAObra. Però anem pas a pas:
- Volem que la feina de notificar els subscrits a temes la faci
la classe Tema que és qui coneix els seus subscrits.
Per cada usuari haurà de "notificar-li que ha arribat una nova obra".
Per tant:
- Testeja i implementa un mètode notificaNovaObra a la classe
Usuari. Aquest mètode ha de rebre per paràmetres la
informàció per composar el missatge. (Consell: passeu la info amb std::strings).
I el resultat --que cal testejar--
és que el singleton MailStub té un nou missatge.
- Ara sí que podem anar a la classe Tema i testejar/implementar un mètode
notificaNovaObraAUsuaris (per exemple), que amb els mateixos paràmetres
que el mètode d'Usuari. l'efecte d'aquest mètode a testejar,
serà que s'han enviat mails cap al MailStub
- Havent fet aquests tests unitaris, implementar i passar els tests funcionals
és bufar-i-fer-ampolles. Simplement delegar la feina a l'Tema implicat.