首页 > 解决方案 > 测试使用本地私有 SerializedField 的 Unity 方法

问题描述

我想在几秒钟后检查clockText.text 的内容。

public class Clock : MonoBehaviour
{
    [SerializeField]
    TextMeshProUGUI clockText;

    TextMeshProUGUI ClockText { get { return clockText; } }

    float remainingSeconds = 0f;

    public void StartCountDown(int seconds)
    {
        remainingSeconds = seconds;
    }

    private void Update()
    {
        remainingSeconds -= Time.deltaTime;
        ClockText.text = Math.Ceiling(remainingSeconds).ToString();            
    }
}

通过这个测试:

public class TestClock
{
    [UnityTest]
    public IEnumerator ClockShowCorrectTime()
    {
        var clock = new GameObject().AddComponent<Components.Shot.Clock>();
        clock.StartCountDown(2);
        yield return new WaitForSeconds(1);
        Assert.AreEqual("00:01", clock.ClockText.text);
    }
}

但当然clock.ClockText是空的。而且我想将clockText保密,所以我不能从测试中设置clockText。

它是否应该公开,因为我们可以在编辑器上更改它?

标签: unity3d

解决方案


创建一个新的实例Clock不会设置其clockText成员变量,因为它只能在检查器窗口中设置,或者在反序列化时设置。

clockText因此,只有在您创建公共变量并自行设置时,您的测试才会起作用。

另一种解决方法是完全消除对文本字段的依赖,并使时间值只是一个私有字符串变量(带有公共 getter),这样您的时钟也可以在没有显示字段的情况下运行。


推荐阅读