はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity,UniTask】TestRunnerでasync/awaitを使った非同期処理のテストはUniTask.ToCoroutineを使うと簡単

はじめに

今回はasync/awaitのテストについて取り上げたいと思います。

今までTask.Runを使ってみたりでなんとか対応させていましたが、UniTask.ToCoroutineを使うことでもっとスマートに書けることを後輩に教えてもらいました。

github.com

一応公式のGitHubにも記載されている(全く気づきませんでした…)のですが、こちらでも紹介したいと思います。

コード

実際にコードを見てもらった方が早いと思うので、載せます。

public class UniTaskTest
{
    [UnityTest]
    public IEnumerator ToCoroutineTest() => UniTask.ToCoroutine(async () =>
    {
        // 完了済のUniTaskを生成(awaitした瞬間10が返ってくる)
        var task = UniTask.FromResult(10);

        var result = await task;

        Assert.That(result, Is.EqualTo(10));
    });
}


もう感動ものです。

ただ必ず[Test]ではなく[UnityTest]を用いなければならない箇所(返り値はIEnumeratorに固定)には注意です。

注意点

また[UnityTest]ですと[TestCase][TestCaseSource]が使えないそうなので、ValuesValueSourceを使って書くと良いと思います。

light11.hatenadiary.com

private static int[] _values = {1, 3, 9};

[Test, TestCase(1), TestCase(3), TestCase(9)]
public void TestCaseTest(int value)
{
    Assert.That(value, Is.GreaterThan(0));
}
    
[Test, TestCaseSource(nameof(_values))]
public void TestCaseSourceTest(int value)
{
    Assert.That(value, Is.GreaterThan(0));
}

↓

[UnityTest]
public IEnumerator ValuesTest([Values(1, 3, 9)] int value) => UniTask.ToCoroutine(async () =>
{
    // 完了済のUniTaskを生成(awaitした瞬間valueが返ってくる)
    var task = UniTask.FromResult(value);
        
    var result = await task;

    Assert.That(result, Is.GreaterThan(0));
});
    
[UnityTest]
public IEnumerator ValueSourceTest([ValueSource(nameof(_values))] int value) => UniTask.ToCoroutine(async () =>
{
    // 完了済のUniTaskを生成(awaitした瞬間valueが返ってくる)
    var task = UniTask.FromResult(value);
        
    var result = await task;

    Assert.That(result, Is.GreaterThan(0));
});