De acuerdo con la documentación del módulo delegate
rieles:
Si el objeto delegado es nula una se plantea una excepción, y eso ocurre sin importar si nil responde al método delegado. Puede obtener un cero en su lugar con la opción: allow_nil.
me gustaría crear un objeto de evento event
con una nula o establecidos event.league = nil
, a continuación, tratar de llamar event.name
, y comprobar que se produce una excepción, ya que eso es lo que se supone que sucede cuando allow_nil
es falso (que también es el predeterminado). Sé rspec tiene este idioma para las pruebas de excepción:
lambda{dangerous_operation}.should raise_exception(optional_exception_class)
no estoy seguro de si la debería haber tiene esta construcción, aunque hay are some articles, kinda old, about how to get this behavior in shoulda.
Creo que vale la pena probar si es el comportamiento que los usuarios de esta clase pueden esperar o suponer que sucederá, lo que creo que probablemente sea cierto en este caso. No me extendería para probar "debería delegar", porque eso parece más dependiente de la implementación: en realidad está diciendo que su Evento debería hacer una excepción si intenta llamar al #name
cuando tiene una liga nula. Realmente no es importante para los usuarios del Evento cómo lo estás logrando. Incluso iría tan lejos, si desea afirmar y tomar nota de este comportamiento, para probar que Event#name
tiene la misma semántica que League#name
, sin mencionando algo sobre delegate
, ya que este es un enfoque centrado en el comportamiento.
Cree sus pruebas según cómo se comporta su código, no cómo está construido; probar de esta manera es una mejor documentación para quienes tropiecen con sus pruebas, ya que están más interesados en la pregunta "¿por qué se lanza mi Evento? " o "¿qué puede causar que Evento arroje?" que "¿este evento está delegando?".
Puede resaltar este tipo de situación imaginando qué fallas podrían ocurrir si cambia su código de una manera que a los usuarios de Event no les importe. Si no les importa, la prueba no se debe interrumpir cuando la cambien. ¿Qué sucede si quiere, por ejemplo, manejar la delegación usted mismo, escribiendo una función #name
que primero registra o incrementa un contador y luego delegados al ? al probar el comportamiento de aumento de excepciones, está protegido de este cambio, pero al probar si Evento es un delegado, romperá esa prueba cuando realice este cambio, por lo que su prueba no fue lo que realmente es importante sobre la llamada al #name
.
De todos modos, eso es todo solo charla soapbox. tl; dr: pruébelo si es un comportamiento en el que alguien pueda confiar.Todo lo que no se prueba es el gato de Shroedinger: roto y no roto al mismo tiempo. A decir verdad, la mayor parte del tiempo esto puede estar bien: es una cuestión de gusto si quieres decir algo riguroso y definitivo sobre cómo se debe comportar el sistema, o simplemente dejar que sea un "comportamiento no especificado".
Es posible que desee considerar esto: alguien más hizo el trabajo por usted. https://gist.github.com/txus/807456 – weltschmerz