Version: 6000.3
语言: 中文
12. 构建时的设置和清理
14. 保持测试状态

13. 域名重新加载

学习目标

在本节中,您将学习如何调用和等待域重新加载。

介绍和动机

执行影响脚本一段代码,允许您创建自己的组件、触发游戏事件、随时间修改组件属性以及以您喜欢的任何方式响应用户输入。更多信息
请参阅术语表
在项目中,Unity 会执行域重新加载。由于域重新加载会重新启动所有脚本,因此有必要通过生成WaitForDomainReload.该命令会停止任何进一步的代码执行,然后在域重新加载完成后恢复。

也可以产生一个RecompileScripts命令。这与WaitForDomainReload除了它执行AssetDatabase.Reload()叫。这两个调用都可以配置为预期脚本编译是否成功。

如果在测试运行时发生域重新加载而没有产生这些命令之一,则测试将失败,并显示有关意外域重新加载的错误。

锻炼

示例 13_DomainReload_Solution使用名为ScriptAddingTests.

该测试已经实现了两个辅助方法:

  • CreateScript创建一个 C# 脚本,其中包含一个名为MyTempScript.它有一个名为Verify.

  • VerifyScript实例化MyTempScriptusing reflection 并返回Verify方法。预期的返回值是字符串“OK”。

运行后CreateScriptUnity 现在在项目中有一个新的 C# 文件,因此需要重新编译。任务是创建一个测试,该测试调用CreateScript,处理域重新加载,然后验证来自VerifyScript.

请记住,您的脚本也应该通过删除文件并再次重新编译脚本来自行清理。建议在TearDownUnityTearDown,即使测试失败,它也会运行。

重要提示:导入后,应移动示例测试文件夹 Tests_13进入Assets文件夹中,以便本练习正常工作。

提示

  • 如果RecompileScripts由于它是内部的,因此您无法使用,那么您需要将 Unity 测试框架包升级到 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

12. 构建时的设置和清理
14. 保持测试状态