PlayModeとは
複数フレームに渡ってテストを実行できるツールです。
これにより、イベントや物理演算もテストが可能になりました。
試してみる
今回は物理演算を利用したSceneを作成して、PlayModeTestを試してみます。
前提
こんなSceneを作成しました
実行するとCubeが生成され、そのまま落下していきます
イベントを追加
2つのコードを作成して、Cubeのy座標が100以下になったら、OnCubeHellが呼ばれるように設定します。
public class CubeManager : MonoBehaviour {
// cubeの座標が y < 100以下になったら呼ばれる
public static UnityEvent OnCubeHell = new UnityEvent();
}
public class CubeController : MonoBehaviour
{
// Update is called once per frame
void Update () {
if(transform.position.y < -100)
CubeManager.OnCubeHell.Invoke();
}
}
テストを書いてみる
PlayModeTestを利用するためには、Window -> TestRunner -> PlayModeの「Enable playmode tests」を有効にする必要があります
一旦Unityを再起動し、PlayModeが有効になったら。テストを書いてみます。
今回は、OnCubeHellが機能するか確かめるテストを書いて確かめてみます
public class CubeTest {
/// <summary>
/// [SetUp]
/// 各テストが呼ばれる前に毎回呼ばれる
/// </summary>
[SetUp]
public void Init()
{
SceneManager.LoadScene("Main");
}
[UnityTest]
public IEnumerator OnCubeHellコールバックが呼ばれるか()
{
yield return new MonoBehaviourTest<OnCubeHellCallBackTest>();
}
}
class OnCubeHellCallBackTest : MonoBehaviour, IMonoBehaviourTest
{
/// <summary>
/// Trueにすると呼び出し元のyieldに戻る(テスト完了となる)
/// </summary>
public bool IsTestFinished { get; private set; }
void Start()
{
CubeManager.OnCubeHell.AddListener(OnCubeHellCallback);
}
void OnCubeHellCallback()
{
IsTestFinished = true;
}
}
コードの内容について説明します
[SetUp]
public void Init()
{
SceneManager.LoadScene("Main");
}
Sceneをロードします。
[SetUp]
が追加されたメソッドは、各テストば呼ばれる前に毎回呼び出されます。
[UnityTest]
public IEnumerator OnCubeHellコールバックが呼ばれるか()
{
yield return new MonoBehaviourTest<OnCubeHellCallBackTest>();
}
[UnityTest]
が追加されたメソッドはTestRunner上でPlayModeTestとして扱われます。ここでは、コールバックを検出するクラスOnCubeHellCallBackTestを呼び出しています
class OnCubeHellCallBackTest : MonoBehaviour, IMonoBehaviourTest
{
/// <summary>
/// Trueにすると呼び出し元のyieldに戻る(テスト完了となる)
/// </summary>
public bool IsTestFinished { get; private set; }
void Start()
{
CubeManager.OnCubeHell.AddListener(OnCubeHellCallback);
}
void OnCubeHellCallback()
{
IsTestFinished = true;
}
}
OnCubeHellが機能するかテストします。IMonoBehaviourTest
を実装することで、IsTestFinished
変数が利用できるようになります。
IsTestFinished = true
となるとテストが完了したとみなされ、呼び出し元のyieldに処理が戻ります。
テストを実行する
コールバックが機能して、テストが終了したことがわかりました!
最後に
今回使用したプロジェクトファイルを公開します。
https://github.com/rarudo/PlayModeTestExample