万年素人からHackerへの道

万年素人がHackerになれるまで殴り書きするぜ。

  • ・資産運用おすすめ
    10万円は1000円くらい利益
    資産運用ブログ アセマネ
    • ・寄付お願いします
      YENTEN:YYzNPzdsZWqr5THWAdMrKDj7GT8ietDc2W
      BitZenny:ZfpUbVya8MWQkjjGJMjA7P9pPkqaLnwPWH
      c0ban:8KG95GXdEquNpPW8xJAJf7nn5kbimQ5wj1
      Skycoin:KMqcn7x8REwwzMHPi9fV9fbNwdofYAWKRo

    NUnitLiteでのコルーチン系のテスト Unity

    例えば、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 ();
        }
    

    とやったが効果なし。