はじめに
今回はasync/await
のテストについて取り上げたいと思います。
今までTask.Run
を使ってみたりでなんとか対応させていましたが、UniTask.ToCoroutine
を使うことでもっとスマートに書けることを後輩に教えてもらいました。
一応公式の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]
が使えないそうなので、Values
やValueSource
を使って書くと良いと思います。
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)); });