Estoy tratando de entender el diseño basado en pruebas, específicamente RSpec. Pero estoy teniendo problemas con algunos de los ejemplos de The RSpec Book.RSpec: ¿cómo escribo una prueba que espera cierto resultado pero no me importa el método?
En el libro, ponemos a prueba para la salida en $ STDOUT como esto:
output = double('output')
game = Game.new
output.should_receive(:puts).with('Welcome to Codebreaker!')
game.start()
Bueno, que funciona en cierto modo. Pero, ¿por qué debería importarme si el objeto Game usa el método puts()? Si lo cambio a imprimir(), ¿realmente debería romper la prueba? Y, lo que es más importante, ¿no está esto en contra de uno de los principios de TDD, que debería probar lo que hace el método (el diseño) en lugar de cómo lo hace (la implementación)?
¿Hay alguna manera de que pueda escribir una prueba que simplemente pruebe qué termina en $ STDOUT, sin mirar qué método pone allí?
Le estoy dando la señal a David para que se vincule con esa publicación sorprendente que afirma que los burlajes son malvados porque combinan el conocimiento de las partes internas de su código con la prueba. Eso va a tomar mucho en pensar, pero sospecho que hay mucha verdad en eso. Ese artículo hace la misma sugerencia que Andrew, y creo que allí es donde voy a hacer esto. Gracias a todos. – Andy