Unity 6.3
0 онлайн 42 гостей 3 в системе
Вход

13. Перезагрузка доменов

Цели обучения

В этом разделе вы узнаете, как вызывать и ждать Domain Reloads.

Введение и мотивация

При выполнении действий, которые влияют на скрипты в проекте, Unity выполняет перезагрузку домена. Поскольку перезагрузка домена перезапускает все скрипты, то необходимо отметить ожидаемую перезагрузку домена, выдав WaitForDomainReload. Команда останавливает любое дальнейшее выполнение кода и возобновляет его после завершения перезагрузки домена.

Также возможно выдать команду RecompileScripts. Эта команда выполняет то же самое, что и WaitForDomainReload, за исключением того, что она выполняет вызов AssetDatabase.Reload(). Оба вызова могут быть настроены на ожидание, будет ли компиляция скрипта успешной.

Если перезагрузка домена происходит во время выполнения теста без выполнения одной из этих команд, то тест завершится с ошибкой о неожиданной перезагрузке домена.

2010 год

образец 13_DomainReload_Solution настроен с тестовым классом ScriptAddingTests.

В тесте уже реализованы два вспомогательных метода:

  • CreateScript создаёт скрипт C# с классом MyTempScript. Что имеет метод, называемый Verify.

  • VerifyScript создает экземпляр MyTempScript с помощью отражения и возвращает значение из метода Verify. Ожидаемым возвращаемым значением является строка “OK”.

После запуска CreateScript Unity теперь имеет новый файл C# в проекте и поэтому нуждается в перекомпиляции. Задача состоит в создании теста, который вызывает CreateScript, обрабатывает перезагрузку домена и затем проверяет выход из VerifyScript.

Помните, что ваш скрипт должен также очистить себя, удалив файл и перекомпилировав скрипт снова. Рекомендуется делать это в TearDown или UnityTearDown, которые будут запускаться даже если тест не удастся.

Важно: После импорта, вы должны переместить папку образца теста Tests_13 в папку Assets для работы этого упражнения.

Подсказки

  • Если RecompileScripts вам недоступен, поскольку он внутренний, то необходимо обновить пакет Unity Test Framework до версии 1.1.0 или новее.
  • Если вы работаете на машине, не относящейся к Windows, вы можете изменить пути внутри k_fileName или использовать C# Path.Combine для более безопасного кросс-платформенного кода.

Решение

Полное решение доступно в образце 13_DomainReload_Solution.

Испытание может проводиться следующим образом:

internal class ScriptAddingTests
{
 private const string k_fileName = @"Assets\\Tests\\TempScript.cs";
 
 [UnityTest]
 public IEnumerator CreatedScriptIsVerified()
 {
  CreateScript();
  yield return new RecompileScripts();

  var verification = VerifyScript();
  
  Assert.That(verification, Is.EqualTo("OK"));
 }

 [UnityTearDown]
 public IEnumerator Teardown()
 {
  if (!File.Exists(k_fileName))
  {
   yield break;
  }
  
  File.Delete(k_fileName);
  yield return new RecompileScripts();
 }
 
 private void CreateScript()
 {
  File.WriteAllText(k_fileName, @"
  public class MyTempScript {
   public string Verify()
   {
    return ""OK"";
   } 
  }");
 }

 private string VerifyScript()
 {
  Type type = Type.GetType("MyTempScript", true);
  
  object instance = Activator.CreateInstance(type);

  var verifyMethod = type.GetMethod("Verify", BindingFlags.Instance | BindingFlags.Public);

  var verifyResult = verifyMethod.Invoke(instance, new object[0]);
  return verifyResult as string;
 }
}

Дополнительные ресурсы

API ссылка на RecompileScripts
API ссылка на WaitForDomainReload