例えば、WWWやWaitForSecondsなどを使いたい時、
コルーチンは必須になる。
例として、このように書いた。
このUnity用UnitTestツールであるNUnitLiteは、
MonoBehaviourを継承してアタッチして使うタイプだが、
今回SomeTestInPlugins自体には普通はMonoBehaviorをわざわざ継承する必要はないが、
StartCoroutineのために継承させた。
public class OriginalApiAccessTest : MonoBehaviour { void Start () { NUnitLiteUnityRunner.RunTests (); } } [TestFixture] public class SomeTestInPlugins : MonoBehaviour { [Test] public IEnumerator Test1 () { yield return new WaitForSeconds (1.0f); Assert.True (9 >= 0); } }
しかし、yield を使っているためTest1にはIEnumeratorを使うと
Assem / Failure: 2 Tests : 1 Errors, 1 Failures, 0 Not Run Errors and Failures: 1) RunFindOpponentTest (SomeTestInPlugins.RunFindOpponentTest) System.NullReferenceException :
のようなエラーが出る。
しかしながら、
[Test] public void Test1 () { StartCoroutine (SubRoutine ()); } public IEnumerator SubRoutine () { yield return new WaitForSeconds (1.0f); Assert.True (9 >= 0); }
のように他のメソッドに丸投げすると、
Assem / Failure: 2 Tests : 1 Errors, 1 Failures, 0 Not Run Errors and Failures: 1) RunFindOpponentTest (SomeTestInPlugins.RunFindOpponentTest) System.NullReferenceException :
となる。
どうしたものか???
ちなみに、ラムダ式でTest1メソッド内にAssertがあれば行けるのかと
[Test] public void Test1 () { StartCoroutine (Hoge (() => { return Assert.True (9 >= 0);})); } public IEnumerator Hoge (System.Action returnData) { yield return StartCoroutine (WaitForRequest (returnData)); } private IEnumerator WaitForRequest (System.Action returnData) { yield return new WaitForSeconds (1.0f); returnData (); }
とやったが効果なし。