使用本地私有Seri​​alizedField的Test Unity方法

时间:2019-06-12 15:59:22

标签: unity3d

我想在几秒钟后检查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。

应该公开吗,因为我们可以在编辑器上对其进行更改?

1 个答案:

答案 0 :(得分:1)

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

因此,只有将clockText设置为公共变量并自己进行设置,您的测试才会起作用。

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