Тестируйте метод Unity, который использует локальный приватный SerializedField - PullRequest
1 голос
/ 12 июня 2019

Я хотел бы проверить содержимое 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 Ответ

1 голос
/ 12 июня 2019

При создании нового экземпляра Clock не будет установлена ​​переменная-член clockText, поскольку она устанавливается только в окне инспектора или при десериализации.

Таким образом, ваш тест будет работать только при выполнении clockText общедоступная переменная и установите ее самостоятельно.

Еще один обходной путь - полное удаление зависимости от текстового поля и установка значения времени в качестве частной строковой переменной (с общедоступным геттером), так что ваши часы также могут работать безполе дисплея.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...