Documentation

Unity Engine


User Manual

Script Reference

Unity Engine


13. Domain reload

Invoke and wait for domain reload from your tests.
Read time 2 minutesLast updated a day ago

Learning objectives

In this section, you will learn how to invoke and wait for Domain Reloads.

Intro and motivation

When performing actions that affect the scripts in a project, Unity performs a domain reload. Since a domain reload restarts all scripts, then it's necessary to mark any expected domain reload by yielding a
WaitForDomainReload
. The command stops any further code execution and then resumes after the domain reload is done.
It's also possible to yield a
RecompileScripts
command. This does the same as
WaitForDomainReload
except that it performs an
AssetDatabase.Reload()
call. Both calls can be configured to expect whether a script compilation is expected to succeed.
If a domain reload happens while a test is running without yielding one of these commands, then the test will fail with an error about an unexpected domain reload.

Exercise

The sample
13_DomainReload_Solution
is set up with a test class called
ScriptAddingTests
.
The test has two helper methods already implemented:
  • CreateScript
    creates a C# script with a class called
    MyTempScript
    . That has a method called
    Verify
    .
  • VerifyScript
    instantiates an instance of
    MyTempScript
    using reflection and returns the value from the
    Verify
    method. The expected return value is the string "OK".
After running
CreateScript
Unity now has a new C# file in the project and thus needs to recompile. The task is to create a test that calls
CreateScript
, handles the domain reload and then verifies the output from
VerifyScript
.
Remember that your script should also clean up after itself, by deleting the file and recompiling the script again. This is recommended to do in a
TearDown
or
UnityTearDown
, which will run even if the test fails.
Important
After importing, you should move the sample test folder
Tests_13
into the
Assets
folder for this exercise to work.

Hints

  • If
    RecompileScripts
    is unavailable to you due to it being internal, then you need to upgrade the Unity Test Framework package to version 1.1.0 or higher.
  • If you are on a non-Windows machine you might want to change paths inside k_fileName or use C# Path.Combine for more cross-platform safe code.

Solution

A full solution is available in the sample
13_DomainReload_Solution
.
The test can be implemented as follows:
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; }}

Additional resources