unit-testing swift bdd

unit testing - Swift-prueba unitaria y vars privado



unit-testing bdd (1)

Estoy escribiendo una prueba de unidad BDD para un método público . El método cambia una propiedad privada ( private var ), por lo que me gustaría escribir un expect () y asegurarme de que esté configurado correctamente. Dado que es privado, no puedo determinar cómo acceder desde el objetivo de la prueba unitaria.

Para Objective-C, simplemente agregaría un encabezado de extensión. ¿Hay algún truco similar en Swift? Como nota, la propiedad tiene un didSet () con algo de código también.


(Tenga en cuenta que Swift 2 agrega el atributo @testable que puede hacer que los métodos internos y las propiedades estén disponibles para la prueba. Consulte los comentarios de @ JeremyP a continuación para obtener más información).

No. En Swift, privado es privado. El compilador puede usar este hecho para optimizar, por lo que dependiendo de cómo use esa propiedad, es legal que el compilador la haya eliminado, haya insertado o haya hecho cualquier otra cosa que le proporcione el comportamiento correcto basado en el código realmente en ese compilador. archivo. (Si el optimizador es realmente tan inteligente hoy o no, está permitido).

Ahora, por supuesto, si declaras que tu clase es @objc , puedes romper esas optimizaciones y puedes buscar ObjC para leerla. Y hay soluciones extrañas que pueden permitirle usar Swift para llamar a métodos expuestos @objc arbitrarios (como un NSTimer tiempo de espera NSTimer ). Pero no hagas eso.

Este es un problema de prueba clásico, y la respuesta de prueba clásica es no probar de esta manera. No pruebes el estado interno. Si es literalmente imposible decir desde el exterior que algo ha sucedido, entonces no hay nada que probar. Rediseñe el objeto para que se pueda probar a través de su interfaz pública. Y generalmente eso significa composición y burla.

Probablemente la versión más común de este problema es el almacenamiento en caché. Es muy difícil probar que algo está en la memoria caché, ya que la única diferencia puede ser que se recupera más rápido. Pero aún es comprobable. Mueva la funcionalidad de almacenamiento en caché a otro objeto y permita que su objeto bajo prueba acepte un objeto de almacenamiento en caché personalizado. Luego puede pasar un simulacro que registra si se realizaron las llamadas de caché correctas (o llamadas de red, o llamadas a bases de datos, o lo que sea que tenga el estado interno).

Básicamente la respuesta es: rediseñar para que sea más fácil de probar.

OK, pero realmente, realmente, realmente lo necesito ... ¿cómo hacerlo? OK, es posible sin romper el mundo.

Cree una función dentro del archivo para probar que exponga lo que desea. No es un método Solo una función gratuita. Luego puede poner esa función auxiliar en #if TEST , y establecer TEST en su configuración de prueba. Idealmente, haría que la función realmente pruebe lo que te interesa en lugar de exponer la variable (y en ese caso, tal vez puedas dejar que la función sea interna o incluso pública). Pero de cualquier forma.