--
Has recibido este mensaje porque estás suscrito al grupo "TDDev" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a tddev-sp+u...@googlegroups.com.
Para publicar una entrada en este grupo, envía un correo electrónico a tdde...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/tddev-sp?hl=es.
Para obtener más opciones, visita https://groups.google.com/groups/opt_out.
Tampoco estoy de acuerdo con la ultima frase; prefiero extraer la logica de setup a un metodo helper y repetirlo en cada metodo. Pero este puede ser un smell que las pruebas se puedan parametrizar y evitar tener N test methods.Ya que el libro identifica los patrones que siguen las pruebas, es contradictorio en alghunas partes. Alli no encuentras una receta unica para escribir las pruebas sino varios enfoques sobre la organizacion de pruebas.
--
--
public void TijerasPiedra_Piedra() {Values CurrentVal1 = Values.Tijera;Values CurrentVal2 = Values.Piedra;Result CurrentResult = _SUT.Solve(CurrentVal1, CurrentVal2);Assert.AreEqual(CurrentResult, Result.SecondWin);}
lo cambiamos por esto otro:
public void The_Second_Player_Win_When_The_First_Select_Tijera_And_The_Second_Select_Piedra() {theSecondPlayerWinWhen(TheFirstPlayerSelectTijera, andTheSecondPlayerSelectPiedra)}private void theSecondPlayerWinWhen(firstPlayerSelection, SecondPlayerSelection) {Assert.AreEqual(_SUT.Solve(firstPlayerSelection, SecondPlayerSelection), Result.SecondWin);}
TheFirstPlayerSelectTijera y andTheSecondPlayerSelectPiedra son simplemente constantes que defines a nivel de la clase de test.
Fijate que esos nombres "currentVal1" o "currentVal2" no aportan información (cuando un nombre tenga un número... mala cosa), otra cosa que debería alertarte es que existe muchisima duplicación en los test, son todos prácticamente iguales. (Aunque en realidad la solución que a mi me gusta para este caso es hacer un test datadriven, no se si .net existe algún framework que te permita algo así, supongo que algo habrá)
class JuegoPiedraPapelTijeraLagartoSpockTest,,,public void can_detect_when_the_second_player_win() {theSecondPlayerWinWhen(TheFirstPlayerSelectTijera, andTheSecondPlayerSelectPiedra)theSecondPlayerWinWhen(TheFirstPlayerSelectTijera, andTheSecondPlayerSelectPiedra)theSecondPlayerWinWhen(TheFirstPlayerSelectTijera, andTheSecondPlayerSelectPiedra) }
class JuegoPiedraPapelTijeraLagartoSpockTest,,,public void can_detect_when_the_second_player_win() {theSecondPlayerWinWhen(TheFirstPlayerSelectTijera, andTheSecondPlayerSelectPiedra)
theSecondPlayerWinWhen(...)theSecondPlayerWinWhen(...) }Ahora si intentas leer el nombre dela clase junto con los nombres de test tendrías algo como:JuegoPiedraPapelTijeraLagartoSpock can_detect_when_the_second_player_win
JuegoPiedraPapelTijeraLagartoSpock can_detect_when_the_first_player_win
JuegoPiedraPapelTijeraLagartoSpock can_detect_a_draw_game
El truco es siempre usar el nombre de la clase de test como sujeto y luego el nombre de test, si de esta forma obtienes una especificación textual de lo que hace tu clase entonces los nombres son buenos. A mi me parece que así queda chulo.Lo de la regla de un sólo assert es una simplificación en mi opinión excesiva, cada test prueba un caso diferente y tu eliges la granularidad de esos casos, mientras todos estén al mismo nivel y no sea una granularidad excesiva a mi me parece aceptable.Aunque como digo este test es un claro ejemplo de un data driven, con spock seria algo como:def "Piedra, papel, tijera, largto, spock game scenarios"() {expect: game.(firstPlayerSelection, SecondPlayerSelection) == expectedWinnerehere:firstPlayerSelection | SecondPlayerSelection | expectedWinnerTijera | Piedra | SecondPlayerWinTijera | Tijera | Draw
Tijera | Spock | SecondPlayerWin
}De esta manera queda una tabla que representa exactamente las normas del juego de la más forma más clara que se me ocurre