Creé un script para mi juego de Unity administrando el estado de desplazamiento del objeto del juego al que está adjunto el script
public sealed class HoverStateController : MonoBehaviour { private void OnMouseOver() { UpdateEntityHoverState(true); } private void OnMouseExit() { UpdateEntityHoverState(false); } private void UpdateHoverState(bool hovered) { // ... modify the state ... } }Sé que no debo intentar probar métodos privados porque no hay necesidad de hacerlo, puedo verificar el resultado del servicio público ( ¿Debo probar métodos privados o solo públicos? ).
La cuestión es que la lógica en UpdateHoverState se puede probar muy fácilmente. Así que podría
OnMouseOver y OnMouseExit activando algoPreferiría el último, pero no sé si Unity ofrece una forma de activar esos métodos. ¿Hay alguna manera de crear un simulacro que los llame internamente?
En primer lugar, se llama a OnMouseOver() en cada cuadro en el que probablemente desee usar OnMouseEnter() en su lugar.
El scripting de Unity no es puro OO siéntete libre de violar las leyes cuando lo creas necesario. Por ejemplo, cada mensaje de Unity puede ser public, protected, private etc., por lo que podría hacer público el modificador de acceso y activarlo usted mismo.
También puede usar la reflexión para llamar a métodos privados, ya que solo desea probar la lógica interna del método UpdateHoverState() , esto podría ser mejor. Sin embargo, la reflexión es vulnerable a los refactores (necesita el nombre del método en forma de cadena). Para acceder a métodos privados a través de un método de extensión genial usando la reflexión, vea esta respuesta .
Y también puede usar símbolos de preprocesador para hacer público un método al probarlo o para proporcionar información adicional sobre la clase. Preprocesadores de Unity
#if TESTING // public wrapper method when testing public void UpdateHoverStateTestHelper(bool hovered) { UpdateHoverState(hovered); } #endif void UpdateHoverState(bool hovered) { // ... modify the state ... } #if TESTING || UNITY_EDITOR // Now we will know the method name even when it gets renamed (using refactoring tools) static readonly string UpdateHoverStateMethod = nameof(UpdateHoverState); #endif void UpdateHoverState(bool hovered) { // ... modify the state ... } #if TESTING || UNITY_EDITOR // nameof is accessed at compile time so the string can be const too const string UpdateHoverStateMethod = nameof(UpdateHoverState); #endif void UpdateHoverState(bool hovered) { // ... modify the state ... } Lo bueno de esto es que cada vez que esté construyendo para su plataforma de destino, estos códigos se eliminarán (suponiendo que desactive el preprocesador de TESTING )