【问题标题】:How to trigger OnMouseOver/OnMouseExit in a Unity test script?如何在 Unity 测试脚本中触发 OnMouseOver/OnMouseExit?
【发布时间】:2021-01-10 09:53:21
【问题描述】:

我为我的 Unity 游戏创建了一个脚本,用于管理脚本所附加到的游戏对象的悬停状态

public sealed class HoverStateController : MonoBehaviour
{
    private void OnMouseOver()
    {
        UpdateEntityHoverState(true);
    }

    private void OnMouseExit()
    {
        UpdateEntityHoverState(false);
    }

    private void UpdateHoverState(bool hovered)
    {
         // ... modify the state ...
    }
}

我知道我不应该尝试测试私有方法,因为没有必要,我可以检查公共服务的结果(Should I test private methods or only public ones?)。

问题是UpdateHoverState 中的逻辑很容易测试。所以我可以

  • 不测试它,因为它是私有的
  • 将方法公开并对其进行测试,但访问修饰符应尽可能受到限制,因此这违反了惯例 (Access Modifiers - what's the purpose?)
  • 通过触发某事来执行OnMouseOverOnMouseExit

我更喜欢最后一个,但我不知道 Unity 是否提供了触发这些方法的方法。有没有办法创建一个在内部调用它们的模拟?

【问题讨论】:

  • 我不确定,但是否应该将其作为单元测试进行测试。它不应该是 UI 测试的一部分吗?
  • 嗯,我不确定,必须阅读一下

标签: c# unity3d


【解决方案1】:

首先,OnMouseOver() 在您可能想要使用 OnMouseEnter() 的每一帧中被调用。

Unity 的脚本不是纯粹的 OO,您可以在需要时随意违反法律。例如。每条 Unity 消息都可以是 public, protected, private 等,因此您可以将访问修饰符设为公开并自己触发。

您也可以使用反射来调用私有方法,因为您只想测试UpdateHoverState() 方法的内部逻辑,这可能会更好。但是反射很容易被重构(您需要字符串形式的方法名称)。有关使用反射通过很酷的扩展方法访问私有方法,请参阅this answer

您还可以使用预处理器符号,以便在测试时公开方法或提供有关该类的其他信息。 Unity preprocessors

#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 ...
}

这些很酷的一点是,每当您为目标平台构建时,这些代码都会被剥离(假设您取消设置 TESTING 预处理器)

【讨论】:

  • 非常感谢您的努力。我认为最好简单地将On... 方法公开并触发它们,而不是创建一个完整的反射逻辑.. :)
  • 欢迎您,是的,这可能是最简单的方法,反正没有 Unity 开发人员会直接在游戏逻辑中调用引擎消息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-31
  • 1970-01-01
相关资源
最近更新 更多